2016-01-05 17 views
55

Per il seguente codice:pylint messaggio: logging-format-interpolazione

logger.debug('message: {}'.format('test')) 

pylint produce il seguente avviso:

registrazione in formato-interpolazione (W1202):

Utilizzare% formattazione nelle funzioni di registrazione e passare i parametri% come argomenti Utilizzato quando un'istruzione di registrazione ha un modulo di chiamata "logging. (Format_string.format (format_args ...))". Tali chiamate devono invece utilizzare la formattazione%, ma lasciare l'interpolazione alla funzione di registrazione passando i parametri come argomenti.

So che posso disattivare questo avviso, ma mi piace capirlo. Presumo che l'utilizzo di format() sia il modo preferito per stampare le istruzioni in python3. Perché questo non è vero per le dichiarazioni del logger?

risposta

68

Non è vero per la dichiarazione del logger perché si basa sul precedente formato "%" come stringa per fornire un'interpolazione lazy di questa stringa utilizzando argomenti aggiuntivi dati alla chiamata del logger. Per esempio invece di fare:

logger.error('oops caused by %s' % exc) 

si dovrebbe fare

logger.error('oops caused by %s', exc) 

modo la stringa viene interpolata solo se il messaggio è effettivamente emesso.

Non è possibile usufruire di questa funzionalità quando si utilizza .format().


Per la sezione Optimization dei logging docs:

formattazione di argomenti di messaggi è differita fino a che non può essere evitato. Tuttavia, calcolare gli argomenti passati al metodo di registrazione può anche essere costoso, e potresti voler evitare di farlo se il logger getterà via il tuo evento.

+0

Che cos'è esattamente la funzionalità di cui non si può beneficiare? '.format()' è sempre espanso? È questo che significa "interpolazione pigra", che viene espanso solo quando viene chiamato? – pfnuesel

+3

@pfnuesel, .format() è espanso prima della chiamata a logger.error, mentre "interpolazione pigra" significa che l'espansione viene eseguita solo se necessario (ad esempio il messaggio viene effettivamente visualizzato da qualche parte) – sthenault

+6

Esiste un buon riferimento per questa valutazione pigra preferito e facendo la differenza? Non sono riuscito a trovarne uno in [PEP282] (https://www.python.org/dev/peps/pep-0282/) o [nella libreria di registrazione] (https://docs.python.org/2/library /logging.html) – culix

Problemi correlati