2016-01-05 11 views
55

は:PyLintメッセージ:次のコードのロギング形式補間

ロギングフォーマット補間(W1202):

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

pylintは、次の警告を生成しますロギング関数に%形式を使用し、%パラメータを 引数として渡します。ロギングステートメントの呼び出し形式がの場合に使用されます"ロギング(format_string.format(format_args ...))"。そのような 呼び出しは代わりに%形式を使用する必要がありますが、引数を引数として渡すことによって、ログ機能の補間を に任せます。

私はこの警告をオフにすることができますが、私はそれを理解したいと思います。私はformat()を使用して、python3のステートメントをプリントアウトするのが望ましいと仮定しました。なぜロガーのステートメントには当てはまりませんか?

答えて

68

ロガー呼び出しに与えられた余分な引数を使用してこの文字列の遅延補間を提供するためにstringのような以前の "%"形式に依存するため、logger文には当てはまりません。たとえば、代わりにやって:

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

を次のメッセージが実際に放出されるのであれば、文字列のみが補間されます

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

を行う必要があります。

.format()を使用すると、この機能を利用することはできません。 loggingドキュメントのOptimizationセクション毎の


それは避けることができないまで、メッセージ引数のフォーマットは延期されます。しかし、ロギングメソッドに渡された引数を計算することは高価になる可能性があり、ロガーがイベントを捨てる場合は避けてください。

+0

恩恵を受けることができない機能は何ですか? '.format()'は常に展開されていますか?これは、「遅延補間」とは、呼び出されたときにのみ展開されるということですか? – pfnuesel

+3

@pfnuesel、.format()はlogger.errorの呼び出しの前に展開されますが、 "lazy interpolation"は必要な場合にのみ拡張が行われることを意味します(メッセージは実際にどこかに表示されます) – sthenault

+6

この遅延評価差をつけるのが好きですか? [PEP282](https://www.python.org/dev/peps/pep-0282/)または[ロギングライブラリ](https://docs.python.org/2/library)で見つからなかった/logging.html) – culix