Supponiamo che in python sia presente una routine che accetta tre parametri con nome (come ** args), ma devono essere compilati due qualsiasi di questi tre. Se è compilato solo uno, è un errore. Se tutti e tre sono, è un errore. Che tipo di errore vorresti aumentare? RuntimeError, un'eccezione creata in modo specifico o altro?Quale eccezione da sollevare se il numero errato di argomenti è passato a ** arg?
risposta
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".
Farei uno specifico. Puoi prenderlo e gestirlo con quell'eccezione specifica poiché è una circostanza speciale che hai creato :)
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
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! :)
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)
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.
- 1. Numero errato di argomenti?
- 2. Eccezione corretta da sollevare se Nessuno incontrato come argomento
- 3. Numero errato di argomenti per l'attributo
- 4. Errore Java Reflections: numero errato di argomenti
- 5. Errore Rspec mocks: numero errato di argomenti
- 6. Quale tipo di eccezione devo gettare se viene passato il tipo di oggetto sbagliato?
- 7. ValueError è un'eccezione appropriata da sollevare se l'utente passa argomenti di lunghezze diverse, il che significa essere uguali?
- 8. Numero errato di argomenti passati a una funzione Clojure
- 9. Quale eccezione nulla da lanciare?
- 10. carmen_rails country_select numero errato di argomenti (3 per 0)
- 11. "numero errato di argomenti" ArgumentError quando si utilizza tutto l'
- 12. Passaggio da Arg a Clojure da Java
- 13. ArgumentError: numero errato di argomenti (1 per 2)
- 14. Numero errato di argomenti con SQL ISNULL() sul DB Access
- 15. Numero errato di argomenti quando la bussola correre guardano
- 16. form_for numero errato di argomenti nelle guide 4
- 17. Condizionalmente il numero arbitrario di argomenti denominati predefiniti a una funzione
- 18. Qual è l'errore di numero magico errato?
- 19. Scope per "sollevare" senza argomenti a gestori di eccezioni nidificate in Python 2 e 3
- 20. traccia dello stack python di stampa senza sollevare nessuna eccezione
- 21. Come eseguire il ciclo di una va_list se il numero di argomenti è sconosciuto?
- 22. QString :: arg() con il numero dopo il segnaposto
- 23. Verificare se l'argomento è passato a una funzione Java Script
- 24. quale eccezione da lanciare se la lista è vuota in java?
- 25. form_for numero errato di argomenti (3 per 2), in quanto l'aggiornamento a rotaie 3.1
- 26. Passando numero variabile di argomenti da una funzione all'altra
- 27. ora-06553 pls-306 numero errato o tipi di argomenti in chiamata a 'ogc_x'
- 28. Come passare argomenti da: comando a funzione?
- 29. Rails 3.2: ArgumentError: numero errato di argomenti (2 per 1) il creare
- 30. PHP, come passare i valori di func-get-arg a un'altra funzione come lista di argomenti?
Questo è un bell'esempio di utilizzo dell'ereditarietà multipla. Grazie. –