Mensaje de PyLint: interpolación de formato de registro

Resuelto pfnuesel asked hace 8 años • 9 respuestas

Para el siguiente código:

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

pylintproduce 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?

pfnuesel avatar Jan 06 '16 02:01 pfnuesel
Aceptado

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 loggingdocumentos:

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.

sthenault avatar Jan 06 '2016 13:01 sthenault

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 .pylintrcarchivo 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 .pylintrcarchivo: old, new,fstr

fstropción agregada en 2.4 y eliminada en 2.5

Descripción del .pylintrcarchivo (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 newla 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 .

mustafagok avatar Nov 25 '2019 07:11 mustafagok