2016-01-05 24 views
55

Dla następującego kodu:pylint wiadomość: rejestrowanie-Format-interpolacja

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

pylint produkuje następujące ostrzeżenie:

rejestrowanie format-interpolacji (W1202):

Użyj% formatowania w funkcjach rejestrowania i przekazuj parametry% jako argumenty Używane, gdy instrukcja rejestrowania ma formularz połączenia "logowanie. (Format_string.format (format_args ...))". Takie wywołania powinny zamiast tego używać formatowania%, ale pozostawić interpolację funkcji rejestrowania , przekazując parametry jako argumenty.

Wiem, że mogę wyłączyć to ostrzeżenie, ale lubię to rozumieć. Zakładałem, że używanie format() jest preferowanym sposobem drukowania instrukcji w python3. Dlaczego nie jest tak w przypadku instrukcji rejestratora?

Odpowiedz

68

Nie jest to prawdą w przypadku instrukcji rejestratora, ponieważ polega ona na wcześniejszym formacie "%", takim jak łańcuch, w celu zapewnienia leniwej interpolacji tego ciągu za pomocą dodatkowych argumentów podanych do wywołania rejestratora. Na przykład zamiast robić:

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

należy zrobić

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

więc ciąg będzie interpolowana tylko wtedy, gdy wiadomość jest rzeczywiście emitowany.

Nie można skorzystać z tej funkcji podczas korzystania z .format().


Per sekcji Optimization z logging docs:

formatowanie argumentów wiadomości jest odroczone do czasu nie da się uniknąć. Jednak obliczanie argumentów przekazanych do metody rejestrowania może być również kosztowne, a możesz chcieć tego uniknąć, jeśli rejestrator po prostu wyrzuci Twoje zdarzenie.

+0

Czym dokładnie jest funkcjonalność, z której nie można skorzystać? Czy '.format()' jest zawsze rozszerzone? Czy to właśnie oznacza "leniwą interpolację", że jest ona rozszerzana tylko po wywołaniu? – pfnuesel

+3

@pfnuesel, .format() jest rozwijany przed wywołaniem logger.error, podczas gdy "leniwy interpolacja" oznacza, że ​​rozwijanie jest wykonywane tylko w razie potrzeby (np. Wiadomość jest faktycznie wyświetlana gdzieś) – sthenault

+6

Czy istnieje dobre odniesienie dla tej leniwej oceny preferowane i robiące różnicę? Nie mogłem go znaleźć w [PEP282] (https://www.python.org/dev/peps/pep-0282/) lub [bibliotece logowania] (https://docs.python.org/2/library /logging.html) – culix