2012-11-04 14 views
7

używam python3.3 i właśnie dowiedziałem się, że przyjmuje argumentów słów kluczowych w niektóre jego funkcji CPython:Python akceptuje argumenty słów kluczowych w funkcjach CPython?

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

Ale niektóre inne funkcje nie akceptują argumenty słów kluczowych:

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

Moje pytanie brzmi: jaka jest różnica między tymi funkcjami? Które funkcje w CPython akceptują argumenty słów kluczowych, a które funkcje nie? I oczywiście - dlaczego?

Odpowiedz

11

Funkcje CPython, które używają PyArg_ParseTuple() do analizowania ich argumentów, nie obsługują argumentów słów kluczowych (głównie dlatego, że PyArg_ParseTuple() obsługuje tylko parametry pozycyjne, np. Prostą sekwencję).

Jest to wyjaśnione w CPython implementation detailshere:

CPython detal realizacja: implementacja może zapewniają wbudowane funkcji, których parametry pozycyjne nie mają nazwy, nawet jeśli są „o nazwie” dla Celem dokumentacji, która w związku z tym nie może być dostarczona przez słowo kluczowe. W przypadku CPython ma to zastosowanie dla funkcji zaimplementowanych w C, które używają PyArg_ParseTuple() do analizowania ich argumentów .

+0

Hmm, ale w python3.2 nie można wstawiać argumentów słów kluczowych do 'str.split' - czy to oznacza, że ​​zmienili implementację funkcji? – slallum

+1

@salallum, nie mam wersji 3.3 programu CPython, aby to potwierdzić, ale wygląda na to, że implementacja 'split()' w wersji 3.3 nie używa już 'PyArg_ParseTuple()'. –

+3

@salallum: tak, implementacja uległa zmianie. [3.3 str.split akceptuje słowa kluczowe] (http://hg.python.org/cpython/file/9371bf2287c4/Objects/unicodeobject.c#l12197) (używa 'PyArg_ParseTupleAndKeywords()'), ale [3.2 nie] (http://hg.python.org/cpython/file/3.2/Objects/unicodeobject.c#l8691) – jfs

Powiązane problemy