In Python 3, è possibile definire una funzione che richiede "argomenti con parole chiave obbligatori". Questo è più chiaro documentato in PEP 3102. Il messaggio di errore che si ottiene quando si omettono gli argomenti con parole chiave obbligatori include i nomi degli argomenti.
$ python3
Python 3.5.2rc1 (default, Jun 13 2016, 09:33:26)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class X:
... def __init__(self, *, foo, bar, baz):
... self.foo = foo
... self.bar = bar
... self.baz = baz
...
>>> a = X(foo=1,bar=2,baz=3)
# no error
>>> b = X(foo=1,bar=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required keyword-only argument: 'baz'
>>> b = X(foo=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 2 required keyword-only arguments: 'bar' and 'baz'
Tuttavia, questo non è compatibile con il codice che si aspetta di essere in grado di chiamare X()
con posizionali argomenti, e il messaggio di errore che si ottiene è ancora quello che non ti piace:
>>> a = X(1,2,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() takes 1 positional argument but 4 were given
Inoltre, questa funzione non è disponibile in qualsiasi versione di Python 2:
$ python
Python 2.7.12rc1 (default, Jun 13 2016, 09:20:59)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class X(object):
... def __init__(self, *, foo, bar, baz):
File "<stdin>", line 2
def __init__(self, *, foo, bar, baz):
^
SyntaxError: invalid syntax
Migliorare la diagnostica data per gli argomenti posizionali sarebbe probabilmente coinvolto l'hacking dell'interprete. Il team di sviluppo di Python potrebbe essere suscettibile alle patch; Prenderò in considerazione l'idea di inserirlo nella mailing list python-ideas.
Questi argomenti di parole chiave o posizionali? – zwol
@zwol kwargs (che può essere fornito in posizione). –
@zwol, detto questo ... tutti gli argomenti sono denominati argomenti. La funzione non dovrebbe importare se sono fornite come kwarg o posizionalmente, dovrebbe sapere quale manca in base a se stessa in entrambi i modi, no? –