Domanda di base: Qual è il modo più pitonico/logico per creare classi di avvertenza personalizzate? Quali sono le classi di avviso e di eccezione corrette che dovrei creare in sottoclassi?Pythonico, avvisi personalizzati
Motivazione: I requisiti per la libreria che sto scrivendo specificare che se un oggetto c
MyContainer
contiene un elemento x
e il chiamante della biblioteca cerca di mettere un "duplicato" di x
- lo chiamano y
- in c
, viene inviato un avviso al chiamante e il valore restituito di c.my_transformation_method(x, y)
viene inserito in c
per sostituire x
. In altre parole, MyContainer
sostituirà gli elementi con i loro duplicati, ma deve avvisare l'utente quando lo fa.
Sulla base della mia lettura, il modo più flessibile per avvisare il chiamante di una libreria su un'azione non fatale è con lo warnings standard module. Permette al chiamante di gestire l'avvertimento come meglio crede, facendo qualsiasi cosa, ignorando gli avvertimenti e considerandoli come errori. (Si noti che sto usando Python 3, ma io non credo che sia essenziale per la domanda qui.)
Esempio: Quello che ho fatto è definito il seguente sottoclasse avvertimento:
class DuplicateItemWarning(UserWarning, ValueError):
pass
Quindi il metodo add()
di MyContainer
chiama warnings.warn('detected duplicate', DuplicateItemWarning)
quando rileva un tentativo di inserimento di un elemento duplicato.
Domande specifiche:
Dovrei essere sottoclasse
UserWarning
come sopra, o semplicemente sublcassingWarning
?Sembra semanticamente sensato sottoclasse
ValueError
(che, nell'esempio di cui sopra, semplicemente inserisceValueError
nel MRO tra ilWarning
eException
) nel caso in cui un chiamante vuole trattare gli avvisi come errori. C'è uno svantaggio di ciò che non vedo?Impossibile trovare domande precedenti su StackOverflow sulla personalizzazione delle classi di avviso. Questo perché i programmatori Python non amano nemmeno usare il modulo
warnings
?
IMO, l'approccio più poderoso è quello di utilizzare solo gli avvisi e le eccezioni incorporati, fornendo il proprio messaggio. Qual è il caso della sottoclasse? – Wilduck
@Wilduck Potrei aver bisogno di creare altri tipi di avvertimenti per questa libreria, ma mi piace anche la semantica di avere un avviso che è anche un 'errore di valore'. In ogni caso, qual è l'avviso predefinito corretto da utilizzare per questa situazione? 'Warning'? 'UserWarning'? – wkschwartz
Penso che non sia certamente 'Warning'. È la classe base di tutti gli avvertimenti. Vedi http://docs.python.org/py3k/library/warnings.html#warning-categories per un elenco completo, dipende da cosa dovrebbe significare il tuo avvertimento – jadkik94