Angenommen, Sie haben in Python eine Routine, die drei benannte Parameter akzeptiert (als ** args), aber zwei von diesen drei müssen ausgefüllt werden. Wenn nur einer ausgefüllt ist, ist es ein Fehler. Wenn alle drei sind, ist es ein Fehler. Welche Art von Fehler würden Sie aufwerfen? RuntimeError, eine speziell erstellte Ausnahme oder andere?Welche Ausnahme soll ausgelöst werden, wenn falsche Anzahl von Argumenten an ** Argumente übergeben wird?
Antwort
Denken Sie daran, dass Sie Python eingebaute Exception-Klassen Unterklasse (und TypeError
wäre sicherlich die richtige eingebaute Ausnahme-Klasse hier auslösen - das ist, was Python löst, wenn die Anzahl der Argumente nicht mit der Signatur übereinstimmt, im Normalfall Fälle ohne *a
oder **k
Formen in der Signatur). Ich mag es, jedes Paket seine eigenen class Error(Exception)
definieren und dann spezifische Ausnahmen je nach Bedarf vermehren können gegebenenfalls erben, z.B .:
class WrongNumberOfArguments(thispackage.Error, TypeError):
Dann habe ich raise WrongNumberOfArguments
würde, wenn ich so eine Problemsituation zu erkennen.
Auf diese Weise kann jeder Anrufer, der dieses Paket kennt, thispackage.Error
abfangen, wenn er mit einem spezifischen Fehler des Pakets umgehen muss, während andere Anrufer (vermutlich höher in der Anrufkette) immer noch den generischen TypeError
aufrufen um Fehler wie "falsche Anzahl von Argumenten, die in einem Funktionsaufruf verwendet werden" zu behandeln.
Ich würde eine bestimmte machen. Sie können es fangen und mit dieser speziellen Ausnahme umgehen, da es ein spezieller Umstand ist, den Sie erstellt haben :)
Wenn (wie Sie in einem der Kommentare sagen), dass dies ein Programmierfehler ist, dann können Sie AssertionError:
auslösenBTW, wenn Sie nur drei benannte Argumente haben, ** scheint Kwargs wie ein seltsamer Weg, es zu tun. Natürlicher sein könnte:
def two(a=None, b=None, c=None):
pass
ich ein Valueerror oder eine Unterklasse davon verwenden würde: „ausgelöst, wenn ein integrierte Bedienung oder Funktion erhält ein Argument, das die richtige Art hat aber einen unangemessenen Wert, und die Situation ist nicht durch eine genauere Ausnahme wie IndexError beschrieben. "
Pass 3 oder 1 Werte, wenn genau 2 erforderlich sind, wäre technisch ein ungeeigneter Wert sein, wenn Sie alle Argumente ein einzelnes Tupel betrachten ... Zumindest meiner Meinung nach! :)
Warum nicht einfach tun, was Python tut?
>>> abs(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (3 given)
Ich empfehle eine benutzerdefinierte Ausnahme. Wie so:
class NeedExactlyTwo(ValueError):
pass
Dann können Sie raise NeedExactlyTwo
in Ihrem Code.
Vergessen Sie nicht, dies im Docstring für Ihre Funktion zu dokumentieren.
- 1. Falsche Anzahl von Argumenten (2) übergeben an: Kern/erste
- 2. Falsche Anzahl von Argumenten?
- 3. IronRuby - Falsche Anzahl von Argumenten
- 4. Wie wird die Anzahl der Argumente gezählt, die an eine Funktion übergeben werden, die eine variable Anzahl von Argumenten akzeptiert?
- 5. Übergeben von optionalen Argumenten an eine Funktion
- 6. clojure.lang.ArityException: Falsche Anzahl der Argumente (3) an: Client $ Batch
- 7. Argument: falsche Anzahl von Argumenten (1 0), wenn afer_save
- 8. Welche Ausnahme sollte ausgelöst werden, wenn Ergebnisse von externen Callbacks in .NET validiert werden?
- 9. Wie sollten Sie argparse verwenden, um auszuwählen, welche Aktion ausgeführt werden soll, und Argumente übergeben?
- 10. Wie übergeben variable Anzahl von Argumenten an Lambda-Funktion
- 11. Falsche Anzahl von Argumenten (2 3)
- 12. Java Reflections Fehler: Falsche Anzahl der Argumente
- 13. Wie kann ich eine variable Anzahl von Argumenten an Methode2 von Methode1 übergeben, die eine variable Anzahl von Argumenten akzeptiert?
- 14. Welche Argumente kann ich an dbConnect übergeben?
- 15. letsrate gem falsche Anzahl von Argumenten Fehler
- 16. Brechen, wenn Ausnahme ausgelöst wird
- 17. Welche Ausnahme wird ausgelöst, wenn ein wichtiger Parameter/Abhängigkeit fehlt?
- 18. Übergeben von benutzerdefinierten Argumenten an Sidekiq
- 19. Welche Ausnahme sollte für einen ungültigen Dateinamen ausgelöst werden?
- 20. Falsche Anzahl von Argumenten: aufgerufen-interaktiv-p, 1
- 21. form_for falsche Anzahl von Argumenten in Schienen 4
- 22. Übergabe einer unbekannten Anzahl von Argumenten an eine Ruby-Funktion
- 23. Ausnahme ausgelöst, wenn keine Daten empfangen werden
- 24. Falsche Anzahl von Argumenten (1 für 2) für Update-Methode
- 25. Ruby falsche Anzahl von Argumenten in Klasse Instantiierung
- 26. Wie Hilfetext angezeigt wird, wenn keine Argumente übergeben werden
- 27. C# Welche Art von Ausnahme soll ich erheben?
- 28. Übergeben von Argumenten in animation.FuncAnimation()
- 29. Welche Datenstruktur soll verwendet werden?
- 30. Wie kann eine Ausnahme ausgelöst werden, wenn unzulässige Parameter übergeben werden?
Dies ist ein schönes Beispiel für die Verwendung der Mehrfachvererbung. Vielen Dank. –