web-dev-qa-db-de.com

PyLint Nachricht: Logging-Format-Interpolation

Für den folgenden Code:

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

pylint gibt die folgende Warnung aus:

Protokollierungsformat-Interpolation (W1202):

Verwenden Sie die% -Formatierung in den Protokollierungsfunktionen und übergeben Sie die% -Parameter als Argumente. Wird verwendet, wenn eine Protokollierungsanweisung die Aufrufform "Protokollierung. (Format_string.format (format_args ...)" hat. Solche Aufrufe sollten stattdessen die% -Formatierung verwenden, die Interpolation jedoch der Protokollierungsfunktion überlassen, indem die Parameter als Argumente übergeben werden.

Ich weiß, dass ich diese Warnung ausschalten kann, aber ich würde es gerne verstehen. Ich nahm an, dass die Verwendung von format() die bevorzugte Methode ist, um Anweisungen in Python 3 auszudrucken. Warum gilt dies nicht für Logger-Anweisungen?

111
pfnuesel

Dies gilt nicht für die Logger-Anweisung, da sie sich auf das frühere "%" -Format wie string stützt, um eine verzögerte Interpolation dieser Zeichenfolge mit zusätzlichen Argumenten für den Logger-Aufruf zu ermöglichen. Zum Beispiel anstatt zu tun:

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

du solltest tun

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

daher wird die Zeichenfolge nur dann interpoliert, wenn die Nachricht tatsächlich ausgegeben wird.

Sie können diese Funktionalität nicht nutzen, wenn Sie .format() verwenden.


Gemäß dem Abschnitt Optimierung in den logging -Dokumenten:

Die Formatierung von Nachrichtenargumenten wird so lange verschoben, bis sie nicht mehr vermieden werden kann. Das Berechnen der an die Protokollierungsmethode übergebenen Argumente kann jedoch auch teuer sein, und Sie sollten dies möglicherweise vermeiden, wenn der Protokollierer Ihr Ereignis nur wegwirft.

146
sthenault