अगर मैं एक चेतावनी की जड़ मैं आम तौर पर सिर्फ Exceptions
को Warnings
को बढ़ावा देने खोजना चाहते हैं।
अपने मामले में आप बस warnings.simplefilter
या warnings.filterwarnings
का उपयोग कर सकते हैं।
उदाहरण के लिए:
import warnings
def func():
warnings.warn('abc', UserWarning)
def func2():
func()
# Here I promote all UserWarnings to exceptions, but you could also use "warnings.filterwarnings"
# to only promote warnings from a specified module or matching a specified message.
# You may need to check which is most useful/appropriate for you.
warnings.simplefilter("error", UserWarning) # you might need to reset this later :)
func2()
जो एक पूर्ण ट्रैस बैक देता है:
:
---------------------------------------------------------------------------
UserWarning Traceback (most recent call last)
<ipython-input-11-be791e1071e7> in <module>()
8
9 warnings.simplefilter("error", UserWarning)
---> 10 func2()
<ipython-input-11-be791e1071e7> in func2()
5
6 def func2():
----> 7 func()
8
9 warnings.simplefilter("error", UserWarning)
<ipython-input-11-be791e1071e7> in func()
2
3 def func():
----> 4 warnings.warn('abc', UserWarning)
5
6 def func2():
UserWarning: abc
और आप इस डिबग करने के लिए आप आसानी से पिछले सामना करना पड़ा अपवाद पर अजगर हुक सकता pdb
रों चाहते हैं
import pdb
pdb.pm()
परिणामस्वरूप:
> <ipython-input-11-be791e1071e7>(4)func()
-> warnings.warn('abc', UserWarning)
(Pdb) _________________
यह अंतिम सामना के अपवाद के पोस्ट-मॉर्टम विश्लेषण शुरू करता है। जो तुम फ्रेम के माध्यम से खुदाई और चर का निरीक्षण, आदि के लिए सक्षम होना चाहिए
तुम भी एक ध्वज के बारे में पूछा, और वास्तव में वहाँ एक ध्वज है कि, "चेतावनी हैंडलिंग" के लिए सक्षम बनाता -W
flag है। यह warnings.filterwarnings
फ़ंक्शन की तरह बहुत अधिक है। सुविधा के लिए मैंने अभी -W
ध्वज के दस्तावेज की प्रतिलिपि बनाई है:
Warning control. Python’s warning machinery by default prints warning messages to sys.stderr. A typical warning message has the following form:
file:line: category: message
By default, each warning is printed once for each source line where it occurs. This option controls how often warnings are printed.
Multiple -W options may be given; when a warning matches more than one option, the action for the last matching option is performed. Invalid -W options are ignored (though, a warning message is printed about invalid options when the first warning is issued).
Starting from Python 2.7, DeprecationWarning and its descendants are ignored by default. The -Wd option can be used to re-enable them.
Warnings can also be controlled from within a Python program using the warnings module.
The simplest form of argument is one of the following action strings (or a unique abbreviation) by themselves:
ignore
Ignore all warnings.
default
Explicitly request the default behavior (printing each warning once per source line).
all
Print a warning each time it occurs (this may generate many messages if a warning is triggered repeatedly for the same source line, such as inside a loop).
module
Print each warning only the first time it occurs in each module.
once
Print each warning only the first time it occurs in the program.
error:
Raise an exception instead of printing a warning message.
The full form of argument is:
action:message:category:module:line
Here, action is as explained above but only applies to messages that match the remaining fields. Empty fields match all values; trailing empty fields may be omitted. The message field matches the start of the warning message printed; this match is case-insensitive. The category field matches the warning category. This must be a class name; the match tests whether the actual warning category of the message is a subclass of the specified warning category. The full class name must be given. The module field matches the (fully-qualified) module name; this match is case-sensitive. The line field matches the line number, where zero matches all line numbers and is thus equivalent to an omitted line number.
ठीक है, मैं देखता हूं। AFAIK इसे बंदर पैचिंग कहा जाता है। हां, मुझे लगता है कि usercustomize.py इस तरह बंदर पैचिंग करने के लिए एक अच्छी जगह है। धन्यवाद। – guettli
@guettli, यह बंदरगाह है। यद्यपि यह इसका उपयोग करने के लिए एक वैध मामला हो सकता है, यह देखते हुए कि स्रोत को बदला नहीं जाना है, और घुसपैठ कोई तर्क नहीं बदलती है - बस प्रभावी रूप से अधिक लॉगिंग जोड़ती है। – RebelWithoutAPulse