dire che io definisco la seguente classe:Costruttori di classi e argomenti delle parole chiave - In che modo Python determina quale è inatteso?
class MyClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
Normalmente, si potrebbe istanziare questa classe in uno dei seguenti modi:
>>> MyClass(1,2)
<__main__.MyClass object at 0x8acbf8c>
>>> MyClass(1, y=2)
<__main__.MyClass object at 0x8acbeac>
>>> MyClass(x=1, y=2)
<__main__.MyClass object at 0x8acbf8c>
>>> MyClass(y=2, x=1)
<__main__.MyClass object at 0x8acbeac>
Che è bene e dandy.
Ora, cerchiamo con un argomento chiave non valida e vedere cosa succede:
>>> MyClass(x=1, j=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'j'
Python solleva correttamente un errore di tipo e si lamenta del unexpected keyword argument 'j'
.
Ora, possiamo provare con due argomenti chiave non validi:
>>> MyClass(i=1,j=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
Avviso, che due dei keyword argomenti erano validi, ma Python si lamenta solo di uno di loro, 'i'
in questo caso.
Consente invertire l'ordine degli argomenti a parola chiave non validi:
>>> MyClass(j=2, i=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
Questo è interessante. Ho cambiato l'ordine degli argomenti delle parole chiave non valide, ma Python decide ancora di lamentarsi di 'i'
e non di 'j'
. Quindi Python ovviamente non sceglie semplicemente la prima chiave non valida di cui lamentarsi.
Proviamo un po 'di più:
>>> MyClass(c=2, i=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
>>> MyClass(q=2, i=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
In ordine alfabetico, ho provato una lettera prima e uno dopo i
i
, quindi Python non si lamenta in ordine alfabetico.
Qui ci sono alcuni di più, questa volta con i
in prima posizione:
>>> MyClass(i=1, j=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
>>> MyClass(i=1, b=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'i'
>>> MyClass(i=1, a=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'a'
Aha! Mi sono lamentato di 'a'
anziché di 'i'
.
La mia domanda è, quando gli argomenti di parole chiave non validi sono dati a un costruttore di classi, come fa Python a determinare di quale lamentarsi?
Come nota a margine, una chiamata di costruttore classe funziona esattamente allo stesso modo di una chiamata a una funzione (o metodo), quindi è possibile semplificare un po 'i test. – abarnert
@abarnert Lo fanno? Sto ottenendo: 'def my_func (x, y): pass', quindi' my_func (i = 2, a = 1) 'si lamenta di' 'i'', mentre 'MyClass (i = 2, a = 1)' si lamenta di '' a''. – dg123
Come descritto nella risposta di @MartijnPieters, il comportamento non è definito. Pertanto, i risultati dei test in pratica non sono necessariamente utili o applicabili. –