পাইলিন্ট বার্তা: লগিং-ফর্ম্যাট-ইন্টারপোলেশন


161

নিম্নলিখিত কোডের জন্য:

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

pylint নিম্নলিখিত সতর্কতা উত্পাদন করে:

লগিং-ফর্ম্যাট-ইন্টারপোলেশন (W1202):

লগিং ফাংশনগুলিতে% ফর্ম্যাটিং ব্যবহার করুন এবং আর্গুমেন্ট হিসাবে% পরামিতিগুলি পাস করুন যখন লগিং স্টেটমেন্টটিতে "লগিং ( এই জাতীয় কলগুলির পরিবর্তে% ফর্ম্যাটিং ব্যবহার করা উচিত, তবে যুক্তি হিসাবে পরামিতিগুলি পাস করে লগিং ফাংশনে ইন্টারপোলেশনটি ছেড়ে দিন।

আমি জানি আমি এই সতর্কতাটি বন্ধ করতে পারি তবে আমি এটি বুঝতে চাই। আমি ধরে নিয়েছি format()পাইথন 3 এ স্টেটমেন্টগুলি প্রিন্ট করার জন্য পছন্দের উপায়টি কেন লগার স্টেটমেন্টের ক্ষেত্রে এটি সত্য নয়?

উত্তর:


203

লগার স্টেটমেন্টের ক্ষেত্রে এটি সত্য নয় কারণ লগার কলকে দেওয়া অতিরিক্ত আর্গুমেন্ট ব্যবহার করে এই স্ট্রিংটির অলস প্রবৃত্তি সরবরাহ করতে স্ট্রিংয়ের মতো এটি পূর্ববর্তী "%" ফর্ম্যাটটির উপর নির্ভর করে। উদাহরণস্বরূপ না করে:

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

আপনাকে যা করতে হবে

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

সুতরাং স্ট্রিংটি কেবলমাত্র বার্তা দ্বারা প্রবাহিত হবে যদি বার্তাটি প্রকৃতপক্ষে নির্গত হয়।

ব্যবহার করার সময় আপনি এই কার্যকারিতা থেকে কোনও উপকার করতে পারবেন না .format()


প্রতি অপ্টিমাইজেশান বিভাগে loggingদস্তাবেজ:

বার্তা আর্গুমেন্টের বিন্যাস স্থগিত করা হয় যতক্ষণ না এড়ানো যায় না। তবে লগিং পদ্ধতিতে আর্গুমেন্টগুলি গণনা করাও ব্যয়বহুল হতে পারে এবং লগার যদি আপনার ইভেন্টটি ফেলে দেয় তবে আপনি এটি করা এড়াতে চাইতে পারেন।


4
@pfnuesel, .format () লগার.অররের কাছে কল করার আগে প্রসারিত করা হয়েছে, যখন "অলস প্রবৃত্তি" অর্থ প্রয়োজন হলে কেবল সম্প্রসারণ করা হয় (যেমন বার্তাটি আসলে কোথাও প্রদর্শিত হয়)
স্টেনল্ট

10
এই অলস মূল্যায়নের পক্ষে অগ্রাধিকার দেওয়া এবং কোনও পার্থক্যের জন্য কি কোনও ভাল রেফারেন্স রয়েছে? আমি PEP282 বা লগিং লাইব্রেরিতে
6:48

25
তবে এর অর্থ কি এই যে আমাদের পরে কোড সহ রক্ষণাবেক্ষণের সমস্যা হবে? আপগ্রেড .format()হওয়ার কারণে আমরা কি পরে পাইলেন্ট দ্বারা "প্রস্তাবিত" হব logging? আমি জিজ্ঞাসা করি কারণ কমপক্ষে বেশিরভাগ কাজের জন্য আমি রক্তপাতের গতির কর্মক্ষমতা থেকে বেশি রক্ষণাবেক্ষণে আগ্রহী maintain
মাইক উইলিয়ামসন

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.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

পাইলট এখনও এই কোডের জন্য একই সতর্কতা দেয় :

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}")

ব্যক্তিগতভাবে, আমি পিইপি -098 এর কারণে ftr বিকল্প পছন্দ করি ।


2
আপনি "python.linting.pylintArgs": ["--logging-format-style=old"]vscode / settings.json ফাইলটিতে যুক্ত করতে পারেন । ডকস
মোস্তফাগোক

2
পাইলট ২.৩.১ এ: optparse.OptionValueError: option logging-format-style: invalid value: 'fstr', should be in ['old', 'new']সর্বশেষ পাইলটকে আপগ্রেড করা (২.৪.৪) এটি ঠিক করেছে।
ফ্লোরিয়ান ক্যাসটেলেন

: আমি নিম্নলিখিত ত্রুটির হচ্ছে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

3

আমার অভিজ্ঞতায় অলস প্রবৃদ্ধির জন্য অপ্টিমাইজেশনের (বেশিরভাগ ব্যবহারের ক্ষেত্রে) তুলনায় আরও জোরালো কারণ হ'ল এটি সেন্ট্রির মতো লগ এগ্রিগ্রেটারদের সাথে দুর্দান্ত খেলে।

একটি 'ব্যবহারকারী লগ ইন' লগ বার্তা বিবেচনা করুন। আপনি যদি ব্যবহারকারীকে বিন্যাসের স্ট্রিংয়ে বিভক্ত করেন তবে ব্যবহারকারীরা যতটা স্বতন্ত্র লগ বার্তা পাবেন। আপনি যদি এইভাবে অলস প্রবণতা ব্যবহার করেন তবে লগ অ্যাগ্রিগেটর আরও বিভিন্ন যুক্তির সাথে একসাথে একই লগ বার্তা হিসাবে এটিকে আরও যুক্তিসঙ্গতভাবে ব্যাখ্যা করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.