2009-12-26 3 views

Antwort

13

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.

+0

Dies ist ein schönes Beispiel für die Verwendung der Mehrfachvererbung. Vielen Dank. –

3

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 :)

4

Wenn (wie Sie in einem der Kommentare sagen), dass dies ein Programmierfehler ist, dann können Sie AssertionError:

auslösen

BTW, 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 
0

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! :)

11

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) 
0

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.

Verwandte Themen