34 Stimmen

Python: erforderlicher kwarg, welche Ausnahme soll ausgelöst werden?

Ein Weg, um sicherzustellen, dass eine Methode mit einem bestimmten kwarg aufgerufen wird, wäre wie folgt:

def mymethod(self, *args, **kwargs):
    assert "required_field" in kwargs

Aufzucht eines AssertionError scheint mir nicht die beste Lösung zu sein. Gibt es eine vereinbarte eingebaute Ausnahme, um dies mit einer schönen Fehlermeldung zu behandeln?

Weitere Informationen: es gibt 3rd-party subclassing Probleme, wo *args und **kwargs irgendwie' übergeben werden müssen, so dass "required_field" ein positionelles Argument ist nicht wirklich eine gute Option.

44voto

Otto Allmendinger Punkte 26430
>>> def foo(bar): pass
... 
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() missing 1 required positional argument: 'bar'

Ich würde einfach mit TypeError

34voto

Mikhail Korobov Punkte 21059

+1 für TypeError. Dies ist, was Python 3 für erforderliche Schlüsselwort-Argumente auslöst:

>>> def foo(*, x):
...     pass
... 
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() needs keyword-only argument x
>>> foo(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() takes exactly 0 positional arguments (1 given)
>>> foo(x=2)

(Der TypeError-Vorschlag wurde bereits gegeben (und akzeptiert); ich habe diese Antwort geschrieben, um diese Python 3-Funktion zu erwähnen).

18voto

mgilson Punkte 280928

Die Standardbibliothek scheint es zu mögen, die TypeError wenn er die falsche Anzahl von Argumenten erhält. Das ist im Wesentlichen Ihr Problem, also würde ich das ansprechen.

Davon abgesehen, **kwargs im Wesentlichen die meiste Zeit für Standardargumente einspringen, so dass ein erforderliches Standardargument ein wenig überraschend/verwirrend erscheint.

Beachten Sie, dass Python Sie gerne positionale Argumente per Schlüsselwort aufrufen lässt:

>>> def foo(a, b):
...     print a, b
... 
>>> foo(a=1, b=2)
1 2
>>> foo(b=1, a=2)
2 1

aber ich vermute, dass sie dann tous müssen mit einem Schlüsselwort referenziert werden ( foo(2, a=2) nicht funktioniert), was Sie vielleicht nicht wollen.

0voto

munk Punkte 11610

Ich denke KeyError wäre am besten geeignet, weil **kwargs ist eine dict .

>>> def foo(**kwargs):
...  print kwargs['abc']
...
>>> foo()
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
KeyError: 'abc'

Wenn das Feld tatsächlich erforderlich ist, können Sie es überprüfen

try:
  kwargs['required']
except KeyError:
  raise KeyError('required is a Required Argument')

-2voto

IT Ninja Punkte 5996

Wenn es ein obligatorisches Schlüsselwort sein soll, machen Sie etwas wie:

def mymethod(self,myrequired=None):
    if myrequired==None:
        #raise error
    #do other stuff down here

Sie sollten nicht wirklich brauchen, um es von kwargs ziehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X