Python - thứ tự giải nén giá trị trong các tham số phương thức


8
def fun(a, b, c, d):
    print('a:', a, 'b:', b, 'c:', c, 'd:', d)

tại sao cái này hoạt động

fun(3, 7, d=10, *(23,))

và in ra:

a: 3 b: 7 c: 23 d: 10

trong khi điều này

fun(3, 7, c=10, *(23,))

không làm

Traceback (most recent call last):
  File "/home/lookash/PycharmProjects/PythonLearning/learning.py", line 10, in <module>
    fun(3, 7, c=10, *(23,))
TypeError: fun() got multiple values for argument 'c'

Tôi không biết lý do chính xác mà lỗi được đưa ra, nhưng bạn không bao giờ nên có các đối số biến sau các đối số từ khóa. Thông thường một lỗi được ném nhưng bộ giải nén tuple dường như ném một lỗi khác với bình thường SyntaxError: positional argument follows keyword argument.
Lỗi - hối hận cú pháp

@ Lỗi-SyntaticsRemorse. Tôi nghĩ rằng bạn đang thiếu điểm. OP đã tìm thấy một trường hợp mà bạn thực sự có thể đặt một vị trí sau một từ khóa, và nó hoạt động.
Nhà vật lý điên

@MadPhysicist Tôi thấy điều đó. Nhưng tôi không chỉ đưa ra một tuyên bố rằng việc giải nén không nên diễn ra sau các đối số từ khóa. Vì vậy, tôi đã làm cho nó như là một bình luận không phải là một câu trả lời.
Lỗi - hối hận cú pháp

1
Câu hỏi tuyệt vời. Không bao giờ biết đây là một điều.
Lỗi - hối hận cú pháp

Câu trả lời:


6

Với *(23,), bạn đang giải nén các giá trị trong các tuple (23,)như các đối số vị trí, sau các đối số vị trí đó đã được xác định, cụ thể là 3cho a7cho b, vì vậy 23sẽ được gán cho tham số c, đó là lý do fun(3, 7, d=10, *(23,))công việc, nhưng trong fun(3, 7, c=10, *(23,))bạn cũng được gán giá trị 10đến cnhư một đối số từ khóa, do đó, nó được coi là xung đột vì ckhông thể được chỉ định với cả hai 2310.

Lưu ý rằng trong khi hợp pháp, một số người không khuyến khích giải nén các đối số có thể lặp lại sau các đối số từ khóa, như được thảo luận ở đây , mặc dù cú pháp cuối cùng được quy định là ở lại.


Rõ ràng những gì đang xảy ra, nhưng từ khi nào bạn có thể giải nén vị trí sau các từ khóa?
Nhà vật lý điên

Kể từ Python 3.
blhsing

Bạn có một nguồn cho điều đó? Nó cố ý và ghi lại, hoặc được cho là một lỗi / thiếu sót?
Nhà vật lý điên

Việc giải nén tuple phải diễn ra trước các đối số từ khóa về thứ tự hoạt động. Có thể là một thiếu sót ...
Lỗi - Sự hối hận về mặt thực tế

1
@MadPhysicist Tôi xấu. Tôi đã nghĩ về một cái gì đó khác. Cú pháp này thực sự hợp pháp trong Python 2. Trường hợp sử dụng chính, hiển nhiên từ trường hợp kiểm tra CPython f(1,2,c=3,*d,**e)trong test_ast.py , là cho phép hàm bao bọc chuyển các đối số biến và đối số từ khóa sang hàm được bọc theo cách trực quan hơn, bằng cách đặt cả đối số biến và từ khóa biến đối số ở cuối danh sách đối số.
blhsing
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.