Ich habe mich über die Best Practices für die Angabe ungültiger Argumentkombinationen in Python gewundert. Ich bin auf einige Situationen gestoßen, in denen Sie eine Funktion wie diese haben:
def import_to_orm(name, save=False, recurse=False):
"""
:param name: Name of some external entity to import.
:param save: Save the ORM object before returning.
:param recurse: Attempt to import associated objects as well. Because you
need the original object to have a key to relate to, save must be
`True` for recurse to be `True`.
:raise BadValueError: If `recurse and not save`.
:return: The ORM object.
"""
pass
Das einzige Ärgernis dabei ist, dass jedes Paket sein eigenes hat, normalerweise etwas anders BadValueError
. Ich weiß, dass es in Java gibt java.lang.IllegalArgumentException
- ist es gut verstanden, dass jeder seine eigenen BadValueError
in Python erstellen wird, oder gibt es eine andere, bevorzugte Methode?
math.sqrt(-1)
, ist das ein Programmierfehler, der sowieso behoben werden muss.ValueError
ist nicht dazu gedacht, in der normalen Programmausführung gefangen zu werden, oder es würde von abgeleitet werdenRuntimeError
.Ich würde von erben
ValueError
Manchmal ist es besser, eigene Ausnahmen zu erstellen, aber von einer integrierten zu erben, die so nah wie möglich an Ihren Wünschen liegt.
Wenn Sie diesen bestimmten Fehler abfangen müssen, ist es hilfreich, einen Namen zu haben.
quelle
Ich denke, der beste Weg, damit umzugehen, ist die Art und Weise, wie Python selbst damit umgeht. Python löst einen TypeError aus. Zum Beispiel:
Unser Junior-Entwickler hat diese Seite gerade in einer Google-Suche nach "falschen Argumenten für Python-Ausnahmen" gefunden, und ich bin überrascht, dass die offensichtliche (für mich) Antwort in dem Jahrzehnt, in dem diese Frage gestellt wurde, nie vorgeschlagen wurde.
quelle
int('a')
. ). Quellesum()
ohne Argumente auf, was a istTypeError
, aber das OP befasste sich mit "illegalen" Kombinationen von Argumentwerten, wenn die Argumenttypen korrekt sind. In diesem Fall sind beidesave
undrecurse
sind bools, aber wennrecurse
istTrue
dannsave
sein sollte , nichtFalse
. Dies ist einValueError
. Ich bin damit einverstanden, dass eine Interpretation des Titels der Frage von beantwortet wirdTypeError
, jedoch nicht für das vorgestellte Beispiel.Ich habe meistens nur das
ValueError
in dieser Situation verwendete eingebaute gesehen .quelle
Es hängt davon ab, wo das Problem mit den Argumenten liegt.
Wenn das Argument den falschen Typ hat, lösen Sie einen TypeError aus. Zum Beispiel, wenn Sie einen String anstelle eines dieser Booleschen Werte erhalten.
Beachten Sie jedoch, dass wir in Python selten solche Überprüfungen durchführen. Wenn das Argument wirklich ungültig ist, wird wahrscheinlich eine tiefere Funktion die Beschwerde für uns erledigen. Und wenn wir nur den booleschen Wert überprüfen, füttert ihn möglicherweise ein Codebenutzer später einfach mit einer Zeichenfolge, da er weiß, dass nicht leere Zeichenfolgen immer True sind. Es könnte ihm eine Besetzung ersparen.
Wenn die Argumente ungültige Werte haben, erhöhen Sie ValueError. Dies scheint in Ihrem Fall angemessener zu sein:
Oder in diesem speziellen Fall bedeutet ein wahrer Wert für die Wiederholung einen wahren Wert für das Speichern. Da ich dies als Wiederherstellung nach einem Fehler betrachten würde, möchten Sie sich möglicherweise auch im Protokoll beschweren.
quelle
Ich bin nicht sicher , ich stimme mit Vererbung aus
ValueError
- meine Interpretation der Dokumentation ist , dassValueError
ist nur angeblich von builtins angehoben werden ... von ihm erben oder erhöhen es selbst scheint falsch.- ValueError-Dokumentation
quelle
ValueError
für diese Art von Dingen verwendet. Ich denke, Sie versuchen, zu viel in die Dokumentation einzulesen.Stimmen Sie dem Vorschlag von Markus zu, Ihre eigene Ausnahme zu rollen, aber der Text der Ausnahme sollte klarstellen, dass das Problem in der Argumentliste und nicht in den einzelnen Argumentwerten enthalten ist. Ich würde vorschlagen:
Wird verwendet, wenn Schlüsselwortargumente fehlen, die für den jeweiligen Aufruf erforderlich waren, oder wenn Argumentwerte einzeln gültig sind, aber nicht miteinander übereinstimmen.
ValueError
wäre immer noch richtig, wenn ein bestimmtes Argument vom richtigen Typ ist, aber außerhalb des Bereichs liegt.Sollte dies nicht eine Standardausnahme in Python sein?
Im Allgemeinen möchte ich, dass der Python-Stil etwas schärfer darin ist, schlechte Eingaben in eine Funktion (Fehler des Aufrufers) von schlechten Ergebnissen innerhalb der Funktion (mein Fehler) zu unterscheiden. Daher kann es auch einen BadArgumentError geben, um Wertfehler in Argumenten von Wertfehlern in Einheimischen zu unterscheiden.
quelle
KeyError
für nicht gefundenes Schlüsselwort erhöhen (da ein fehlendes explizites Schlüsselwort semantisch mit einem**kwargs
Diktat identisch ist, bei dem dieser Schlüssel fehlt).