Messaggio PyLint: logging-format-interpolation


161

Per il seguente codice:

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

pylint produce il seguente avviso:

logging-format-interpolation (W1202):

Usa la formattazione% nelle funzioni di registrazione e passa i parametri% come argomenti Utilizzati quando un'istruzione di registrazione ha una forma di chiamata di "registrazione. (Format_string.format (format_args ...))". Tali chiamate dovrebbero invece utilizzare la formattazione%, ma lasciare l'interpolazione alla funzione di registrazione passando i parametri come argomenti.

So di poter disattivare questo avviso, ma mi piacerebbe capirlo. Ho pensato che usare format()fosse il modo preferito per stampare le istruzioni in Python 3. Perché questo non è vero per le istruzioni del logger?

Risposte:


204

Non è vero per l'istruzione logger perché si basa sul precedente formato "%" come stringa per fornire un'interpolazione pigra di questa stringa utilizzando argomenti aggiuntivi forniti alla chiamata del logger. Ad esempio invece di fare:

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

dovresti fare

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

quindi la stringa verrà interpolata solo se il messaggio viene effettivamente emesso.

Non è possibile beneficiare di questa funzionalità durante l'utilizzo .format().


Per la sezione Ottimizzazione dei loggingdocumenti:

La formattazione degli argomenti dei messaggi viene rinviata fino a quando non può essere evitata. Tuttavia, calcolare gli argomenti passati al metodo di registrazione può anche essere costoso e potresti voler evitare di farlo se il logger eliminerà semplicemente il tuo evento.


4
@pfnuesel, .format () viene 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

10
Esiste un buon riferimento per preferire questa valutazione pigra e fare la differenza? Non sono riuscito a trovarne uno in PEP282 o nella libreria di registrazione
culmine

25
Ma questo significa solo che avremo problemi di manutenzione con il nostro codice in seguito? In seguito saremo "raccomandati" da Pylint per passare allo .format()stile ad un certo punto perché loggingè stato aggiornato? Lo chiedo perché sono più interessato alla manutenibilità di quanto non lo sia alle prestazioni di velocità all'avanguardia, almeno per la maggior parte delle attività.
Mike Williamson,

3
@MikeWilliamson: penso che questo messaggio sia un avvertimento perché ci sono possibili effetti collaterali, ma puoi tranquillamente ignorarlo.
saihtamtellim,

5
Mentre gran parte della motivazione dietro l'avvertimento riguarda le prestazioni (ovvero: se non viene emessa un'istruzione di registro, il costo di interpolazione viene risparmiato), vale la pena notare che in molte (probabilmente la maggior parte) applicazioni il costo delle prestazioni è trascurabile. Vedi: github.com/PyCQA/pylint/issues/2395 e github.com/PyCQA/pylint/issues/2354
Adam Parkin

23

Forse questa volta le differenze possono aiutarti.

La seguente descrizione non è la risposta alla tua domanda, ma può aiutare le persone.

Per pylint 2.4: Ci sono 3 opzioni per la registrazione stile nel .pylintrcfile di: old, new,fstr

fstropzione aggiunta in 2.4 e rimossa in 2.5

Descrizione dal .pylintrcfile (v2.4):

[LOGGING]

# Format style used to check logging format string. `old` means using %
# formatting, `new` is for `{}` formatting,and `fstr` is for f-strings.
logging-format-style=old

per vecchio ( logging-format-style=old):

foo = "bar"
self.logger.info("foo: %s", foo)

per new ( logging-format-style=new):

foo = "bar"
self.logger.info("foo: {}", foo)
# OR
self.logger.info("foo: {foo}", foo=foo)

Nota : è possibile non utilizzare .format()anche se si seleziona newl'opzione.

pylint dà ancora lo stesso avvertimento per questo codice:

self.logger.info("foo: {}".format(foo))  # W1202
# OR
self.logger.info("foo: {foo}".format(foo=foo))  # W1202

per fstr ( logging-format-style=fstr):

foo = "bar"
self.logger.info(f"foo: {foo}")

Personalmente, preferisco l'opzione fstr a causa di PEP-0498 .


2
è possibile aggiungere "python.linting.pylintArgs": ["--logging-format-style=old"]al file vscode / settings.json. docs
mustafagok

2
nel pylint 2.3.1: l' optparse.OptionValueError: option logging-format-style: invalid value: 'fstr', should be in ['old', 'new']aggiornamento all'ultimo pylint (2.4.4) risolto questo problema.
Florian Castellane,

Sto avendo seguente errore:Try installing a more recent version of python-pylint, and please open a bug report if the issue persists in t\ he latest release. Thanks!
Alper

4

Nella mia esperienza, un motivo più convincente dell'ottimizzazione (per la maggior parte dei casi d'uso) per l'interpolazione pigra è che gioca bene con aggregatori di log come Sentry.

Prendi in considerazione un messaggio di log "accesso dell'utente". Se interpoli l'utente nella stringa di formato, hai tanti messaggi di log distinti quanti sono gli utenti. Se si utilizza l'interpolazione pigra in questo modo, l'aggregatore di log può interpretare più ragionevolmente questo come lo stesso messaggio di log con un gruppo di istanze diverse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.