2016-04-14 10 views
8

Menschen in Antworten erwähnt a1, a2 dassGibt es eine vollständige Liste von integrierten Funktionen, die nicht mit Schlüsselwortargument aufgerufen werden können?

Aufgrund der Art, wie die Python C-Level-APIs entwickelt, viele eingebaute in Funktionen und Methoden tatsächlich keine Namen für ihre Argumente haben.

Ich fand es wirklich nervig, weil ich nicht in der Lage bin, es durch das Betrachten des Docs zu wissen. Zum Beispiel

eval (expression, Globals = None, Einheimische = None)

Dann schrieb ich diese Codezeile

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

und bekam TypeError: eval() takes no keyword arguments. Gibt es eine vollständige Liste von Funktionen dieser Art? Woher weiß ich, ob eine Funktion Schlüsselwortargumente haben darf?

+0

Nicht nur das, aber es gibt Fehler mit diesem, probiere 'sortierte (iterable = [])' vs 'sortierte (iterable = None)'. –

+1

Ich denke, dass alle solche "Traps" eigentlich Bugs sind und gemeldet werden sollten: sowohl "sorted()" als auch die Schlüsselwortargumente dokumentiert, aber nicht akzeptiert. (Fwiw PyPy akzeptiert im Allgemeinen Schlüsselwortargumente.) –

+0

Es wurde über IIRC berichtet. (Ich glaube, ich lese es aus dem Bug Tracker) –

Antwort

4

In Python 3.5 Sie die __text_signature__ der integrierten Funktion überprüfen können:

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

oder

>>> 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 kann nicht als Schlüsselwort-Argument verwendet werden)

Die / bedeutet, dass die folgenden Argumente als Schlüsselwortargumente verwendet werden können. 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> 

Natürlich gibt es Fehler sogar in 3.5:

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

obwohl issue 26729 in the Python bug tracker nach, es sollte / sein, nachdem die iterable als iterable nicht als Schlüsselwort-Argument verwendet werden kann.


Leider ist diese Information noch nicht in der Python-Dokumentation selbst zur Verfügung.

Verwandte Themen