Mensaje de PyLint: interpolación de formato de registro
Para el siguiente código:
logger.debug('message: {}'.format('test'))
pylint
produce la siguiente advertencia:
interpolación de formato de registro (W1202):
Utilice el formato % en las funciones de registro y pase los parámetros % como argumentos. Se utiliza cuando una declaración de registro tiene una forma de llamada de “logging.(format_string.format(format_args...))”. Estas llamadas deberían utilizar el formato % en su lugar, pero dejar la interpolación a la función de registro pasando los parámetros como argumentos.
Sé que puedo desactivar esta advertencia, pero me gustaría entenderla. Supuse que usar format()
es la forma preferida de imprimir declaraciones en Python 3. ¿Por qué esto no es cierto para las declaraciones del registrador?
No es cierto para la declaración del registrador porque se basa en el formato anterior "%" como una cadena para proporcionar una interpolación diferida de esta cadena utilizando argumentos adicionales proporcionados a la llamada del registrador. Por ejemplo, en lugar de hacer:
logger.error('oops caused by %s' % exc)
deberías hacer
logger.error('oops caused by %s', exc)
por lo que la cadena sólo se interpolará si el mensaje realmente se emite.
No puedes beneficiarte de esta funcionalidad cuando usas .format()
.
Según la sección Optimización de los logging
documentos:
El formateo de los argumentos del mensaje se pospone hasta que no se pueda evitar. Sin embargo, calcular los argumentos pasados al método de registro también puede ser costoso y es posible que desee evitar hacerlo si el registrador simplemente descarta su evento.
Quizás esta diferencia horaria te pueda ayudar.
La siguiente descripción no es la respuesta a su pregunta, pero puede ayudar a las personas.
Si desea utilizar fstrings (interpolación literal de cadenas) para iniciar sesión, puede desactivarlo desde el .pylintrc
archivo con disable=logging-fstring-interpolation
, consulte: problema relacionado y comentario .
También puedes desactivar logging-format-interpolation
.
Para pylint 2.4:
Hay 3 opciones para el estilo de registro en el .pylintrc
archivo: old
, new
,fstr
fstr
opción agregada en 2.4 y eliminada en 2.5
Descripción del .pylintrc
archivo (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
para viejo ( logging-format-style=old
):
foo = "bar"
self.logger.info("foo: %s", foo)
para nuevo ( logging-format-style=new
):
foo = "bar"
self.logger.info("foo: {}", foo)
# OR
self.logger.info("foo: {foo}", foo=foo)
Nota : no puede usarlo .format()
incluso si selecciona new
la opción.
pylint todavía da la misma advertencia para este código:
self.logger.info("foo: {}".format(foo)) # W1202
# OR
self.logger.info("foo: {foo}".format(foo=foo)) # W1202
para fstr ( logging-format-style=fstr
):
foo = "bar"
self.logger.info(f"foo: {foo}")
Personalmente, prefiero la opción fstr debido a PEP-0498 .