चेतावनियाँ। अनवर () बनाम लॉगिंग।वरिंग ()


82

उनके बीच क्या अंतर है warnings.warn()और logging.warn()वे क्या करते हैं और उनका उपयोग कैसे किया जाना चाहिए?


8
क्या आप कृपया अपना स्वीकृत उत्तर यहाँ बदलने पर विचार करेंगे?
एंटटी हापाला

जवाबों:


-5

एक अपवाद को उठाता है जिसे पकड़ा जा सकता है या वांछित के रूप में अनदेखा किया जा सकता है, और दूसरा वैकल्पिक रूप से वर्तमान लॉग स्तर के आधार पर लॉग में प्रवेश करता है। एक का उपयोग तब किया जाना चाहिए जब कोई कोड में विभिन्न चीजों के बारे में चेतावनी दे रहा हो, और दूसरे का उपयोग लॉगिंग करते समय किया जाना चाहिए।


23
जहां तक ​​मैं समझता हूं, स्वीकृत उत्तर गलत है। न तो चेतावनी और न ही लॉगिंग एक अपवाद को जन्म देती है। लेकिन संदेश मुद्रित करें। हालांकि उनके पास एक अलग व्यवस्थित है (यह लॉगिंग के माध्यम से चेतावनी को एकीकृत करना संभव है logging.captureWarnings())। चेतावनी संदेश प्रति डिफ़ॉल्ट केवल एक बार दिखाया जाता है, जैसा कि @cxrodgers ने उपयोगकर्ता को अपना कोड बदलने के लिए बताने के लिए समझाया। दूसरे पर प्रवेश करना और सभी चेतावनियों को दर्ज करना, हालांकि, विस्तार से दिखाया जा सकता है। `-W त्रुटि 'का उपयोग करके अपवादों को चेतावनी दी जा सकती है।
DerWeh

कहने के लिए क्षमा करें, यह उत्तर बहुत उपयोगी नहीं है। "एक उठाता है ..." और "एक चाहिए ..."? कौन सा क्या है? warningsया logging?
पीटर लिलवोल्ड

86

मैं दूसरे उत्तर से सहमत हूं - loggingलॉगिंग के लिए है और warningचेतावनी के लिए है - लेकिन मैं और अधिक विवरण जोड़ना चाहूंगा।

यहां एक ट्यूटोरियल-स्टाइल HOWTO है जो आपको loggingमॉड्यूल का उपयोग करने के चरणों के माध्यम से ले जा रहा है । https://docs.python.org/3/howto/log.html

यह सीधे आपके प्रश्न का उत्तर देता है:

लाइब्रेरी कोड में चेतावनियाँ .warn () यदि समस्या से बचने योग्य है और चेतावनी को खत्म करने के लिए क्लाइंट एप्लिकेशन को संशोधित किया जाना चाहिए

logging.warning () अगर कुछ भी नहीं है तो क्लाइंट एप्लिकेशन स्थिति के बारे में नहीं कर सकता है, लेकिन फिर भी घटना को नोट किया जाना चाहिए


60

logging.warningबस WARNINGस्तर पर कुछ लॉग करता है, उसी तरह जो स्तर logging.infoपर लॉग इन करता INFOहै और स्तर logging.errorपर लॉग करता ERRORहै। इसका कोई विशेष व्यवहार नहीं है।

warnings.warnएक को उत्सर्जित करता है Warning, जिसे stderrपूरी तरह से नजरअंदाज किया जा सकता है , या एक सामान्य Exception(संभावित रूप से आपके आवेदन को दुर्घटनाग्रस्त) की तरह फेंक दिया जाता है, जो सटीक Warningउपवर्ग पर निर्भर करता है और आपने अपने चेतावनी फ़िल्टर को कैसे कॉन्फ़िगर किया है । डिफ़ॉल्ट रूप से, चेतावनी को मुद्रित stderrया अनदेखा किया जाएगा।

द्वारा उत्सर्जित चेतावनी के warnings.warnबारे में जानने के लिए अक्सर उपयोगी होते हैं, लेकिन याद रखना आसान होता है (खासकर यदि आप एक पृष्ठभूमि प्रक्रिया में पायथन प्रोग्राम चला रहे हैं और कैप्चर नहीं कर रहे हैं stderr)। इस कारण से, उन्हें लॉग इन करने में मदद मिल सकती है।

पायथन आपको ऐसा करने के लिए loggingमॉड्यूल और मॉड्यूल के बीच एक अंतर्निहित एकीकरण प्रदान करता है warnings; बस logging.captureWarnings(True)अपनी स्क्रिप्ट की शुरुआत में कॉल करें और warningsमॉड्यूल द्वारा उत्सर्जित सभी चेतावनियों को स्वचालित रूप से स्तर पर लॉग इन किया जाएगा WARNING


27

आधिकारिक प्रलेखन में विहित स्पष्टीकरण के अलावा

लाइब्रेरी कोड में चेतावनियाँ .warn () यदि समस्या से बचने योग्य है और चेतावनी को खत्म करने के लिए क्लाइंट एप्लिकेशन को संशोधित किया जाना चाहिए

logging.warning () अगर कुछ भी नहीं है तो क्लाइंट एप्लिकेशन स्थिति के बारे में नहीं कर सकता है, लेकिन फिर भी घटना को नोट किया जाना चाहिए

यह भी ध्यान देने योग्य है कि, डिफ़ॉल्ट रूप warnings.warn("same message")से केवल एक बार दिखाई देगा। यह एक बड़ा ध्यान देने योग्य अंतर है। आधिकारिक डॉक्टर से उद्धृत

समान स्रोत स्थान के लिए किसी विशेष चेतावनी की पुनरावृत्ति आमतौर पर दबा दी जाती है।

>>> import warnings
>>> warnings.warn("foo")
__main__:1: UserWarning: foo
>>> warnings.warn("foo")
>>> warnings.warn("foo")
>>>
>>> import logging
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>>
>>>
>>> warnings.warn("fur")
__main__:1: UserWarning: fur
>>> warnings.warn("fur")
>>> warnings.warn("fur")
>>>

1
ध्यान दें कि "केवल एक बार दिखाओ" इच्छित डिफ़ॉल्ट व्यवहार है, लेकिन चेतावनी फ़िल्टर इसे बदल सकते हैं।
गेरिट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.