पहले से मौजूद चेतावनी श्रेणियों के अलावा, उपयोगकर्ता अपनी स्वयं की चेतावनी कक्षाएं परिभाषित कर सकते हैं , जैसे कि नीचे दिए गए कोड में:

$ cat mwe.py 
#!/usr/bin/env python3.5

import warnings
import pprint

class ObnoxiousWarning(UserWarning):
    pass

for i in range(3):
    print(i)
    warnings.warn("I don't like this.", ObnoxiousWarning)

पायथन को लागू करते समय, -Wध्वज चेतावनियों को फ़िल्टर करने के तरीके को नियंत्रित करता है. लेकिन जब मैं इसे अपनी ताजा खनन चेतावनी श्रेणी को अनदेखा करने का प्रयास करता हूं, तो मुझे बताया जाता है कि फ़िल्टर को अनदेखा कर दिया गया है:

$ python3.5 -W ignore::ObnoxiousWarning ./mwe.py
Invalid -W option ignored: unknown warning category: 'ObnoxiousWarning'
0
./mwe.py:11: ObnoxiousWarning: I don't like this.
  warnings.warn("I don't like this.", ObnoxiousWarning)
1
2

मैं कस्टम चेतावनी श्रेणियों के लिए फ़िल्टर डालने के लिए कमांडलाइन का उपयोग कैसे कर सकता हूं (जैसा कि सभी उपयोगकर्ता चेतावनी या चेतावनी संदेश के आधार पर फ़िल्टरिंग के विपरीत, जो मैं कर सकता हूं)?

2018-11-29 संपादित करें: देखें समस्या 22543: -W विकल्प गैर-मानक श्रेणियों का उपयोग नहीं कर सकता< /ए>

10
gerrit 27 फरवरी 2017, 23:58

1 उत्तर

सबसे बढ़िया उत्तर

कुछ उत्तर पायथन स्रोत कोड में निहित हैं। _getcategory फ़ंक्शन को देखें: https://github.com/python/cpython/blob/3.5 /Lib/warnings.py#L147

def _getcategory(category):
    import re
    if not category:
        return Warning
    if re.match("^[a-zA-Z0-9_]+$", category):
        try:
            cat = eval(category)
        except NameError:
            raise _OptionError("unknown warning category: %r" % (category,))
    else:
        i = category.rfind(".")
        module = category[:i]
        klass = category[i+1:]
        try:
            m = __import__(module, None, None, [klass])
        except ImportError:
            raise _OptionError("invalid module name: %r" % (module,))
        try:
            cat = getattr(m, klass)
        except AttributeError:
            raise _OptionError("unknown warning category: %r" % (category,))
    if not issubclass(cat, Warning):
        raise _OptionError("invalid warning category: %r" % (category,))
    return cat

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

PYTHONPATH='<path_to_dir_where_mwe_located>' python -W ignore::mwe.ObnoxiousWarning

इस तरह, यदि आप अपने मॉड्यूल को पायथन शेल में आयात करते हैं तो चेतावनी को आपकी इच्छानुसार फ़िल्टर किया जाएगा। कमांडलाइन में फ़िल्टर का उपयोग करने के लिए, आपको अपनी चेतावनी को अलग मॉड्यूल में परिभाषित करना होगा, इसके अलावा आप निष्पादित करते हैं।

Mwe.py

class ObnoxiousWarning(UserWarning):
    pass

Entrypoint.py

#!/usr/bin/env python3.5

import warnings
import pprint

from mwe import ObnoxiousWarning

for i in range(3):
    print(i)
    warnings.warn("I don't like this.", ObnoxiousWarning)

और अंत में:

PYTHONPATH='<path_to_dir_where_mwe_located>' python -W ignore::mwe.ObnoxiousWarning ./entrypoint.py
0
1
2

मुझे समझ में नहीं आता क्यों चेतावनी कार्यों के साथ अलग मॉड्यूल को परिभाषित करना, लेकिन यह है। हो सकता है कोई इसे समझाएगा।

5
r_black 29 नवम्बर 2018, 14:29
1
यह चेतावनी मॉड्यूल में कोड का एक आश्चर्यजनक रूप से नाजुक टुकड़ा है, eval... का उपयोग करके।
 – 
gerrit
29 नवम्बर 2018, 14:55
@gerrit: कम से कम यह एक साधारण पहचानकर्ता-जैसी स्ट्रिंग तक सीमित है, तो यह कुछ है। लेकिन इसे वास्तव में import builtins, फिर getattr(builtins, category) or globals().get(category) या इसी तरह का उपयोग करना चाहिए था।
 – 
Martijn Pieters
29 नवम्बर 2018, 14:58
2
अजीब बात है कि मुझे अपने PYTHONPATH में निर्देशिकाओं को स्पष्ट रूप से जोड़ने की आवश्यकता है, जब समान मॉड्यूल सामान्य रूप से उन निर्देशिकाओं के कारण आयात करने योग्य होते हैं जो वे sys.path का हिस्सा होते हैं। हो सकता है कि sys.path के ठीक से शुरू होने से पहले चेतावनियों के नियमों को संसाधित किया गया हो? ऐसा लगता है कि इस स्तर पर साइट पैकेज उपलब्ध नहीं हैं।
 – 
gerrit
29 नवम्बर 2018, 18:58
2
 – 
gerrit
29 नवम्बर 2018, 19:17
हुह। PYTHONPATH=/media/nas/x21324/miniconda3/envs/py37e/lib/python3.7/site-packages/pandas/ python -Werror::errors.DtypeWarning mwe.py मुझे एक कोर डंप देता है।
 – 
gerrit
22 जिंदा 2020, 17:00