2016-04-14 16 views
8

dân đề cập trong câu trả lời a1, a2 rằngCó danh sách đầy đủ các chức năng tích hợp không thể gọi với đối số từ khóa không?

Do cách Python API C cấp phát triển, rất nhiều tên built-in chức năng, phương pháp này không thực sự có cho lập luận của mình.

Tôi thấy nó thực sự gây phiền nhiễu vì tôi không thể biết điều đó bằng cách xem tài liệu. Ví dụ,

eval (biểu hiện, globals = Không, người dân địa phương = Không)

Sau đó, tôi đã viết dòng mã này

print(eval('a+b', globals={'a':1, 'b':2})) 

và có TypeError: eval() takes no keyword arguments. Vì vậy, có một danh sách đầy đủ các chức năng của loại này? Làm cách nào để biết liệu một hàm có được phép có đối số từ khóa không?

+0

Không chỉ vậy nhưng có lỗi với điều này, hãy thử 'sắp xếp (iterable = [])' vs 'được sắp xếp (iterable = Không)'. –

+1

Tôi đoán rằng tất cả các "bẫy" như vậy thực sự là lỗi và cần được báo cáo: cả hai '' được sắp xếp() '' và các đối số từ khóa được ghi lại nhưng không được chấp nhận. (Fwiw PyPy thường chấp nhận các đối số từ khóa.) –

+0

Nó đã được báo cáo IIRC. (Tôi nghĩ rằng tôi đọc nó từ trình theo dõi lỗi) –

Trả lời

4

Trong Python 3.5, bạn có thể kiểm tra việc __text_signature__ của built-in chức năng:

>>> eval.__text_signature__ 
'($module, source, globals=None, locals=None, /)' 

hoặc

>>> abs.__text_signature__ 
'($module, x, /)' 
>>> abs(x=5) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: abs() takes no keyword arguments 

(x không thể được sử dụng như một đối số từ khóa)

Các / có nghĩa là các đối số sau đây có thể được sử dụng làm đối số từ khóa. C.f.

>>> compile.__text_signature__ 
'($module, /, source, filename, mode, flags=0,\n  dont_inherit=False, optimize=-1)' 
>>> compile(source='foo', filename='bar', mode='exec') 
<code object <module> at 0x7f41c58f0030, file "bar", line 1> 

Tất nhiên có những lỗi ngay cả trong 3.5:

>>> sorted.__text_signature__ 
'($module, iterable, key=None, reverse=False)' 

dù theo issue 26729 in the Python bug tracker, có nên được / sau iterable như iterable không thể được sử dụng như một đối số từ khóa.


Rất tiếc, thông tin này chưa có sẵn trong tài liệu Python.

Các vấn đề liên quan