2012-03-07 12 views

risposta

8

Si genera un'eccezione che può essere rilevata o ignorata come desiderato e l'altra aggiunge facoltativamente una voce al registro in base al livello di registrazione corrente. Si dovrebbe usare uno quando si avverte di varie cose nel codice, e l'altro dovrebbe essere usato durante la registrazione.

35

Sono d'accordo con l'altra risposta - logging è per la registrazione e warning è per avviso - ma vorrei aggiungere ulteriori dettagli.

Ecco un HOWTO in stile tutorial che illustra le fasi dell'utilizzo del modulo logging. http://docs.python.org/2/howto/logging.html

risponde direttamente alla tua domanda:

warnings.warn() nel codice di libreria se il problema è evitabile e l'applicazione client deve essere modificato per eliminare l'avviso

logging.warning() se non c'è niente l'applicazione client può fare per la situazione, ma l'evento dovrebbe comunque essere notato

16

logging.warning registra semplicemente qualcosa al livello WARNING, allo stesso modo che i registri logging.info al livello INFO e i registri logging.error al livello ERROR. Non ha un comportamento speciale.

warnings.warn emette un Warning, che può essere stampato stderr, ignorato completamente, o gettato come un normale Exception (potenzialmente crash dell'applicazione) a seconda del preciso Warning sottoclasse emessa e come hai configurato il tuo Avvertenze Filter. Per impostazione predefinita, gli avvisi verranno stampati su stderr o ignorati.

Le avvertenze emesse da warnings.warn sono spesso utili da conoscere, ma facili da perdere (specialmente se si sta eseguendo un programma Python in un processo in background e non si acquisisce stderr). Per questo motivo, può essere utile averli registrati. Python fornisce un'integrazione integrata tra il modulo logging e il modulo warnings per consentirvi di farlo; basta chiamare logging.captureWarnings(True) all'inizio del copione e tutti gli avvisi emessi dal modulo warnings verranno registrati automaticamente al livello WARNING.

6

Oltre al canonical explanation in official documentation

warnings.warn() nel codice di libreria se il problema è evitabile e l'applicazione client deve essere modificato per eliminare l'avviso

logging.warning() se non c'è niente l'applicazione client può fare per la situazione, ma l'evento dovrebbe essere ancora notato

E 'anche interessante notare che, per impostazione predefinita warnings.warn("same message") verranno visualizzati solo una volta. Questa è una differenza notevole notevole.Citato da official doc

Le ripetizioni di un avviso particolare per la stessa posizione di origine sono in genere soppresse.

>>> import warnings 
>>> warnings.warn("foo") 
__main__:1: UserWarning: foo 
>>> warnings.warn("foo") 
>>> warnings.warn("foo") 
>>> 
>>> import logging 
>>> logging.warn("bar") 
WARNING:root:bar 
>>> logging.warn("bar") 
WARNING:root:bar 
>>> logging.warn("bar") 
WARNING:root:bar 
>>> 
>>> 
>>> warnings.warn("fur") 
__main__:1: UserWarning: fur 
>>> warnings.warn("fur") 
>>> warnings.warn("fur") 
>>>