2012-11-04 23 views
7

tôi sử dụng python3.3 và chỉ phát hiện ra rằng nó chấp nhận đối số từ khóa trong một số chức năng CPython của nó:Python chấp nhận các đối số từ khóa trong các hàm CPython?

>>> "I like python!".split(maxsplit=1) 
['I', 'like python!'] 

Nhưng một số chức năng khác không chấp nhận đối số từ khóa:

>>> sum([1,2,3,4], start = 10) 
Traceback (most recent call last): 
    File "<pyshell#58>", line 1, in <module> 
    sum([1,2,3,4], start = 10) 
TypeError: sum() takes no keyword arguments 

Câu hỏi của tôi là: sự khác nhau giữa các chức năng đó là gì? Những chức năng nào trong CPython chấp nhận đối số từ khóa, chức năng nào không? Và tất nhiên - tại sao?

Trả lời

11

Các hàm CPython sử dụng PyArg_ParseTuple() để phân tích đối số của chúng không hỗ trợ đối số từ khóa (chủ yếu là vì PyArg_ParseTuple() chỉ hỗ trợ thông số vị trí, ví dụ: một chuỗi đơn giản).

này được giải thích trong CPython implementation detailshere:

CPython thực hiện chi tiết: An thực hiện có thể cung cấp được xây dựng trong chức năng có tham số vị trí không có tên, ngay cả khi họ được 'tên' cho mục đích của tài liệu và do đó, không thể cung cấp từ khóa . Trong CPython, đây là trường hợp đối với các hàm được triển khai trong C sử dụng PyArg_ParseTuple() để phân tích các đối số của chúng.

+0

Hmm, nhưng trong python3.2 bạn không thể chèn đối số từ khóa trong 'str.split' - điều đó có nghĩa là chúng đã thay đổi việc triển khai hàm? – slallum

+1

@slallum, tôi không có phiên bản 3.3 của CPython để xác nhận nó, nhưng nó thực sự trông giống như việc thực hiện 'split()' trong 3.3 không sử dụng 'PyArg_ParseTuple()' nữa. –

+3

@slallum: có, việc triển khai đã thay đổi. [3.3 str.split chấp nhận từ khóa] (http://hg.python.org/cpython/file/9371bf2287c4/Objects/unicodeobject.c#l12197) (nó sử dụng 'PyArg_ParseTupleAndKeywords()'), nhưng [3.2 không] (http://hg.python.org/cpython/file/3.2/Objects/unicodeobject.c#l8691) – jfs

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