PyLint संदेश: लॉगिंग-स्वरूप-प्रक्षेप


161

निम्नलिखित कोड के लिए:

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

pylint निम्नलिखित चेतावनी उत्पन्न करता है:

लॉगिंग-स्वरूप-प्रक्षेप (W1202):

लॉगिंग फ़ंक्शन में% फ़ॉर्मेटिंग का उपयोग करें और तर्क के रूप में% पैरामीटर पास करें जब लॉगिंग स्टेटमेंट में "लॉगिंग। (format_string.format (format_args ...))" का कॉल फ़ॉर्म होता है। इस तरह की कॉल के बजाय% स्वरूपण का उपयोग करना चाहिए, लेकिन तर्क के रूप में मापदंडों को पारित करके लॉगिंग फ़ंक्शन के लिए प्रक्षेप छोड़ दें।

मुझे पता है कि मैं इस चेतावनी को बंद कर सकता हूं, लेकिन मैं इसे समझना चाहूंगा। मैंने मान लिया कि format()पाइथन 3 में बयानों को प्रिंट करने का पसंदीदा तरीका है। यह लकड़हारा बयानों के लिए सच क्यों नहीं है?

जवाबों:


203

यह लकड़हारा बयान के लिए सच नहीं है क्योंकि यह लकड़हारा कॉल को दिए गए अतिरिक्त तर्कों का उपयोग करके इस स्ट्रिंग के आलसी प्रक्षेप प्रदान करने के लिए स्ट्रिंग जैसे पूर्व "%" प्रारूप पर निर्भर करता है। उदाहरण के लिए करने के बजाय:

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

तुम्हें करना चाहिए

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

यदि संदेश वास्तव में उत्सर्जित होता है, तो स्ट्रिंग को केवल प्रक्षेपित किया जाएगा।

उपयोग करते समय आप इस कार्यक्षमता का लाभ नहीं उठा सकते हैं .format()


डॉक्स के अनुकूलन अनुभाग के अनुसार logging:

जब तक इसे टाला नहीं जा सकता, तब तक संदेश तर्कों का प्रारूप स्थगित कर दिया जाता है। हालाँकि, लॉगिंग विधि में दिए गए तर्कों की गणना करना भी महंगा हो सकता है, और आप यह करने से बचना चाहते हैं कि क्या लकड़हारा सिर्फ आपके इवेंट को फेंक देगा।


4
@pfnuesel, .format () को logger.error पर कॉल करने से पहले विस्तारित किया जाता है, जबकि "आलसी प्रक्षेप" का अर्थ है कि विस्तार केवल तभी किया जाता है जब जरूरत हो (जैसे संदेश वास्तव में कहीं प्रदर्शित किया जाता है)
sthenault

10
क्या इस आलसी मूल्यांकन को तरजीह देने और फर्क करने के लिए एक अच्छा संदर्भ है? मैं में एक नहीं पा सके PEP282 या प्रवेश पुस्तकालय
culix

25
लेकिन क्या इसका मतलब यह है कि हमें बाद में अपने कोड के साथ रखरखाव की समस्या होगी? क्या बाद में हमें .format()किसी बिंदु पर शैली में जाने के लिए पाइलिंट द्वारा "अनुशंसित" किया जाएगा logging? मैं पूछता हूं क्योंकि मैं रक्तस्राव-धार गति प्रदर्शन में कम से कम अधिकांश कार्यों के लिए बनाए रखने में अधिक दिलचस्पी रखता हूं।
माइक विलियमसन

3
@ मायकेविलियम्सन: मुझे लगता है कि यह संदेश एक चेतावनी है क्योंकि संभावित दुष्प्रभाव हैं, लेकिन आप इसे सुरक्षित रूप से अनदेखा कर सकते हैं।

5
जबकि चेतावनी के पीछे की अधिकांश प्रेरणा प्रदर्शन के आसपास है (यानी: यदि कोई लॉग स्टेटमेंट उत्सर्जित नहीं होता है, तो प्रक्षेप लागत बच जाती है), यह ध्यान देने योग्य है कि कई (यकीनन सबसे) अनुप्रयोगों में प्रदर्शन लागत नगण्य है। देखें: github.com/PyCQA/pylint/issues/2395 और github.com/PyCQA/pylint/issues/2354
एडम पार्किन

23

हो सकता है कि इस बार मतभेद आपकी मदद कर सकें।

निम्नलिखित विवरण आपके प्रश्न का उत्तर नहीं है, लेकिन यह लोगों की मदद कर सकता है।

Pylint 2.4 के लिए: में शैली प्रवेश करने के लिए 3 विकल्प हैं .pylintrcफ़ाइल: old, new,fstr

fstrविकल्प 2.4 में जोड़ा गया और 2.5 में हटा दिया गया

.pylintrcफ़ाइल से विवरण (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

के लिए वर्ष ( logging-format-style=old):

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

के लिए नई ( logging-format-style=new):

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

नोट : आप विकल्प का चयन करने पर भी उपयोग नहीं कर सकते हैं.format()new

pylint अभी भी इस कोड के लिए एक ही चेतावनी देता है :

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

के लिए fstr ( logging-format-style=fstr):

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

व्यक्तिगत रूप से, मैं PEP-0498 के कारण fstr विकल्प पसंद करता हूं ।


2
आप "python.linting.pylintArgs": ["--logging-format-style=old"]vscode / settings.json फ़ाइल में जोड़ सकते हैं । डॉक्स
मुस्तफागोक

2
pylint 2.3.1 में: optparse.OptionValueError: option logging-format-style: invalid value: 'fstr', should be in ['old', 'new']नवीनतम pylint में अपग्रेड करना (2.4.4) ने इसे निर्धारित किया।
फ्लोरियन कैस्टेलन

मैं निम्नलिखित त्रुटि कर रहा हूँ: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

मेरे अनुभव में आलसी प्रक्षेप के लिए अनुकूलन (ज्यादातर उपयोग के मामलों के लिए) की तुलना में अधिक आकर्षक कारण यह है कि यह संतरी जैसे लॉग एग्रीगेटर्स के साथ अच्छी तरह से खेलता है।

लॉग संदेश में 'उपयोगकर्ता लॉग इन' पर विचार करें। यदि आप उपयोगकर्ता को प्रारूप स्ट्रिंग में प्रक्षेपित करते हैं, तो आपके पास उपयोगकर्ताओं के रूप में कई अलग लॉग संदेश हैं। यदि आप इस तरह से आलसी प्रक्षेप का उपयोग करते हैं, तो लॉग एग्रीगेटर अधिक तार्किक रूप से इसकी व्याख्या विभिन्न उदाहरणों के समूह के साथ एक ही लॉग संदेश के रूप में कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.