In Python 3 können Sie eine Funktion definieren, die "erforderliche Argumente nur für Schlüsselworte" benötigt. Dies ist am deutlichsten dokumentiert in PEP 3102. Die Fehlermeldung, die Sie erhalten, wenn Sie die erforderlichen Nur-Schlüssel-Argumente weglassen, enthält die Argumentnamen.
$ 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'
Dies ist jedoch mit dem Code nicht kompatibel, die Argumente zu nennen X()
mit Positions in der Lage sein erwartet, und die Fehlermeldung, die Sie erhalten, ist immer noch die, die Sie nicht mag:
>>> 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
auch ist diese Funktion in einer beliebigen Version von Python nicht verfügbar 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
Verbesserung der gegebenen Diagnostik Für Positionsargumente würde wahrscheinlich der Interpreter gehackt werden. Das Python-Entwicklungsteam könnte Patches zur Verfügung stellen. Ich würde erwägen, dies auf die Mailingliste python-ideas zu bringen.
Sind diese Schlüsselwortargumente oder positional? – zwol
@zwol kwargs (das kann positionell geliefert werden). –
@zwol, das heißt ... alle Argumente sind benannte Argumente. Die Funktion sollte sich nicht darum kümmern, ob sie als Kwarts oder positionell geliefert werden, sie sollte wissen, welcher nach sich selbst fehlt, oder? –