2009-12-26 10 views

risposta

13

Ricorda che puoi creare sottoclasse delle classi di eccezioni incorporate di Python (e TypeError sarebbe sicuramente la giusta classe di eccezioni built-in da sollevare qui - questo è ciò che Python solleva se il numero di argomenti non corrisponde alla firma, in normale casi senza moduli *a o **k nella firma). Mi piace avere tutti i pacchetti definire in base alle esigenze dei propri class Error(Exception), e quindi specifiche eccezioni possono moltiplicarsi ereditare a seconda dei casi, ad es .:

class WrongNumberOfArguments(thispackage.Error, TypeError): 

Poi, mi piacerebbe raise WrongNumberOfArguments quando rilevo una situazione del problema.

In questo modo, qualsiasi chiamante che è a conoscenza di questo pacchetto può catturare thispackage.Error, se è necessario gestire qualsiasi errore specifico del pacchetto, mentre altri chiamanti (presumibilmente più in alto nella catena di chiamate) chiamano ancora prendere il più generico TypeError per gestire eventuali errori come "numero errato di argomenti utilizzati in una chiamata di funzione".

+0

Questo è un bell'esempio di utilizzo dell'ereditarietà multipla. Grazie. –

3

Farei uno specifico. Puoi prenderlo e gestirlo con quell'eccezione specifica poiché è una circostanza speciale che hai creato :)

4

Se (come dici in uno dei commenti) che si tratta di un errore del programmatore, allora puoi sollevare un'eccezione di Assertion:

def two(**kwargs): 
    assert len(kwargs) == 2, "Please only provide two args" 

BTW, se hai solo tre argomenti con nome, ** kwargs sembra un modo strano per farlo. Più naturale potrebbe essere:

def two(a=None, b=None, c=None): 
    pass 
0

avrei usato un ValueError, o una sottoclasse loro: "sollevata quando incorporato in funzione o funzione riceve un argomento che ha il tipo giusto ma valore appropriato, e la situazione è non descritto da un'eccezione più precisa come IndexError. "

Passare 3 o 1 valori quando esattamente 2 sono richiesti sarebbe tecnicamente un valore inappropriato se si considerano tutti gli argomenti una singola tupla ... Almeno secondo me! :)

11

Perché non fare semplicemente ciò che fa Python?

>>> abs(1, 2, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: abs() takes exactly one argument (3 given) 
0

Si consiglia un'eccezione personalizzata. Così:

class NeedExactlyTwo(ValueError): 
    pass 

Quindi è possibile raise NeedExactlyTwo nel codice.

Assicuratevi di documentarlo nella docstring per la vostra funzione.

Problemi correlati