2016-04-14 22 views
8

persone menzionate nelle risposte a1, a2 cheEsiste un elenco completo di funzioni integrate che non possono essere richiamate con l'argomento parola chiave?

A causa del modo in cui le API di livello C Python sviluppati, un sacco di nomi built-in funzioni e metodi in realtà non hanno per i loro argomenti.

L'ho trovato davvero fastidioso perché non sono in grado di saperlo guardando il documento. Per esempio,

eval (espressione, globali = None, la gente del posto = Nessuno)

Poi ho scritto questa riga di codice

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

e ottenuto TypeError: eval() takes no keyword arguments. Quindi c'è una lista completa di funzioni di questo tipo? Come faccio a sapere se una funzione è autorizzata ad avere argomenti di parole chiave?

+0

Non solo, ma ci sono bug con questo, prova 'ordinato (iterabile = [])' vs 'ordinato (iterabile = Nessuno)'. –

+1

Immagino che tutte queste "trappole" siano in realtà bug e dovrebbero essere riportate: sia '' sorted() '' sia gli argomenti delle parole chiave documentati ma non accettati. (Fwiw PyPy generalmente accetta argomenti di parole chiave.) –

+0

È stato segnalato IIRC. (Penso di averlo letto dal bug tracker) –

risposta

4

In Python 3.5 è possibile controllare la __text_signature__ della funzione built-in:

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

o

>>> 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 non può essere usato come un argomento parola chiave)

Il / significa che gli argomenti che seguono possono essere usati come argomenti di parole chiave. 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> 

Naturalmente ci sono insetti anche in 3.5:

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

se secondo issue 26729 in the Python bug tracker, ci dovrebbe essere / dopo la iterable come il iterable non può essere usato come un argomento chiave.


Purtroppo questa informazione non è ancora disponibile nella documentazione di Python.