PyLint mesajı: logging-format-interpolation


161

Aşağıdaki kod için:

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

pylint aşağıdaki uyarıyı verir:

logging-format-enterpolasyon (W1202):

Günlük tutma işlevlerinde% biçimlendirmeyi kullanın ve% parametrelerini bağımsız değişkenler olarak iletin Bir günlük kaydı ifadesinde “logging. (Format_string.format (format_args ...))” çağrı formu olduğunda kullanılır. Bu tür çağrılar bunun yerine% biçimlendirmeyi kullanmalı, ancak parametreleri bağımsız değişken olarak ileterek günlükleme işlevine enterpolasyon bırakmalıdır.

Bu uyarıyı kapatabileceğimi biliyorum, ama anlamak istiyorum. Ben format()Python 3 deyimleri yazdırmak için tercih edilen yolu kullanarak kabul varsayılır. Bu logger deyimleri için neden doğru değil?

Yanıtlar:


204

Logger deyimi için doğru değildir, çünkü logger çağrısına verilen ekstra argümanlar kullanılarak bu dizenin tembel enterpolasyonunu sağlamak için dize gibi eski "%" biçimine dayanır. Örneğin:

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

yapmalısın

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

bu nedenle dize yalnızca mesaj gerçekten yayınlandığında enterpolasyon yapılır.

Kullanırken bu işlevsellikten yararlanamazsınız .format().


Başına Optimizasyon bölümünde loggingdocs:

İleti bağımsız değişkenlerinin biçimlendirilmesi, önlenemedikçe ertelenir. Ancak, günlüğe kaydetme yöntemine iletilen bağımsız değişkenleri hesaplamak da pahalı olabilir ve günlükçünün etkinliğinizi atması durumunda bunu yapmaktan kaçınmak isteyebilirsiniz.


4
@pfnuesel, .format (), logger.error çağrısından önce genişletilirken, "tembel enterpolasyon", yalnızca gerektiğinde genişletmenin yapıldığı anlamına gelir (örneğin, mesaj aslında bir yerde görüntülenir)
sthenault

10
Tercih edilen ve fark yaratan bu tembel değerlendirmenin iyi bir referansı var mı? PEP282'de veya kütüphane kütüphanesinde
culix

25
Ancak bu, daha sonra kodumuzla ilgili bakım sorunlarımız olacağı anlamına mı geliyor? Biz daha sonra pylint tarafından yükseltilmiş .format()çünkü bir noktada stile taşımak için "tavsiye" olacak loggingmı? Soruyorum, çünkü en azından çoğu görev için, kanama hızı performansında olduğumdan daha fazla sürdürülebilirlikle ilgileniyorum.
Mike Williamson

3
@MikeWilliamson: Bu mesajın bir uyarı olduğunu düşünüyorum çünkü olası yan etkiler var, ancak güvenle yok sayabilirsiniz.
18:38, saihtamtellim

5
Uyarının arkasındaki motivasyonun çoğu performansla ilgili olsa da (yani: bir günlük ifadesi yayınlanmazsa, enterpolasyon maliyeti kaydedilir), birçok (muhtemelen en) uygulamalarda performans maliyetinin ihmal edilebilir olduğunu belirtmek gerekir. Bakınız: github.com/PyCQA/pylint/issues/2395 ve github.com/PyCQA/pylint/issues/2354
Adam Parkin

23

Belki bu sefer farklılıklar size yardımcı olabilir.

Aşağıdaki açıklama sorunuzun cevabı değildir, ancak insanlara yardımcı olabilir.

PyLint 2.4 için: stili giriş için 3 seçenek vardır .pylintrcdosyaya: old, new,fstr

fstrseçeneği 2.4'te eklendi ve 2.5'te kaldırıldı

.pylintrcDosyadan açıklama (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

için eski ( logging-format-style=old):

foo = "bar"
self.logger.info("foo: %s", foo)

için yeni ( logging-format-style=new):

foo = "bar"
self.logger.info("foo: {}", foo)
# OR
self.logger.info("foo: {foo}", foo=foo)

Not : Eğer yapabilirsiniz değil kullanmak .format()seçmeniz durumunda bilenew seçeneği.

pylint bu kod için hala aynı uyarıyı veriyor :

self.logger.info("foo: {}".format(foo))  # W1202
# OR
self.logger.info("foo: {foo}".format(foo=foo))  # W1202

için fstr ( logging-format-style=fstr):

foo = "bar"
self.logger.info(f"foo: {foo}")

Şahsen, PEP-0498 nedeniyle fstr seçeneğini tercih ediyorum .


2
"python.linting.pylintArgs": ["--logging-format-style=old"]vscode / settings.json dosyasına ekleyebilirsiniz . docs
mustafagok

2
pylint 2.3.1'de: optparse.OptionValueError: option logging-format-style: invalid value: 'fstr', should be in ['old', 'new']en son pylint'e (2.4.4) yükseltme bunu düzeltti.
Florian Castellane

Aşağıdaki hatayı alıyorum:Try installing a more recent version of python-pylint, and please open a bug report if the issue persists in t\ he latest release. Thanks!
alper

4

Deneyimlerime göre, tembel enterpolasyon için optimizasyondan (çoğu kullanım durumu) daha zorlayıcı bir neden, Sentry gibi log toplayıcılarla güzel oynamasıdır.

'Kullanıcı oturum açtı' günlük mesajını düşünün. Kullanıcıyı biçim dizesine enterpolasyon yaparsanız, kullanıcılar kadar çok farklı günlük iletisine sahip olursunuz. Bunun gibi tembel enterpolasyon kullanırsanız, günlük toplayıcı bunu daha farklı örneklerle aynı günlük mesajı olarak daha makul bir şekilde yorumlayabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.