web-dev-qa-db-fra.com

Message PyLint: journalisation-format-interpolation

Pour le code suivant:

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

pylint produit l'avertissement suivant:

logging-format-interpolation (W1202):

Utilisez le formatage% dans les fonctions de journalisation et transmettez les paramètres% en tant qu'arguments. Utilisé lorsqu'une instruction de journalisation a la forme d'appel suivante: "logging. (Format_string.format (format_args ...))". De tels appels devraient utiliser la mise en forme% à la place, mais laisser une interpolation à la fonction de journalisation en transmettant les paramètres en tant qu'arguments.

Je sais que je peux désactiver cet avertissement, mais j'aimerais le comprendre. J'ai supposé que l'utilisation de format() est le moyen préféré pour imprimer des instructions dans Python 3. Pourquoi n'est-ce pas le cas pour les instructions logger?

111
pfnuesel

Ce n'est pas vrai pour l'instruction de consignation, car elle s'appuie sur l'ancien format "%", tel que chaîne, pour fournir une interpolation paresseuse de cette chaîne à l'aide d'arguments supplémentaires fournis à l'appel du consignateur. Par exemple au lieu de faire:

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

tu devrais faire

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

la chaîne ne sera donc interpolée que si le message est réellement émis.

Vous ne pouvez pas bénéficier de cette fonctionnalité lorsque vous utilisez .format().


Selon la section Optimisation de la docs logging:

Le formatage des arguments de message est différé jusqu'à ce qu'il ne puisse plus être évité. Toutefois, le calcul des arguments transmis à la méthode de journalisation peut également être coûteux, et vous voudrez peut-être éviter de le faire si le consignateur va simplement jeter votre événement.

146
sthenault