2012-11-04 72 views
7

我使用python3.3和剛剛發現它接受關鍵字參數在其CPython的功能有些Python在CPython函數中接受關鍵字參數?

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

但其他一些功能接受關鍵字參數:

>>> 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 

我的問題是:這些功能有什麼區別? CPython中的哪些函數接受關鍵字參數,哪些函數不參與?當然 - 爲什麼?

回答

11

使用PyArg_ParseTuple()解析其參數的CPython函數不支持關鍵字參數(主要是因爲PyArg_ParseTuple()僅支持位置參數,例如簡單的序列)。

CPython的實現細節:的實現可以提供內置 功能,其位置參數沒有名字,即使他們 被「命名」爲

這在CPython implementation detailshere解釋文檔的目的,因此 不能由關鍵字提供。在CPython中,對於在C中實現的 函數,使用PyArg_ParseTuple()解析它們的 參數是這種情況。

+0

嗯,但在python3.2中,你不能在'str.split'中插入關鍵字參數 - 這是否意味着它們改變了函數的實現? – slallum

+1

@slallum,我沒有3.3版的CPython來確認它,但它確實看起來像3.3中'split()'的實現不再使用'PyArg_ParseTuple()'。 –

+3

@slallum:是的,實施改變了。 [3.3 str.split接受關鍵字](http://hg.python.org/cpython/file/9371bf2287c4/Objects/unicodeobject.c#l12197)(它使用'PyArg_ParseTupleAndKeywords()'),但[3.2不] (http://hg.python.org/cpython/file/3.2/Objects/unicodeobject.c#l8691) – jfs

相關問題