Jeśli chcę znaleźć korzeń ostrzeżeniem ja generalnie tylko do promowania Warnings
Exceptions
.
W twoim przypadku możesz po prostu użyć warnings.simplefilter
lub warnings.filterwarnings
.
Na przykład:
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()
co daje całościowy traceback:
---------------------------------------------------------------------------
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
A jeśli chcesz debugować ten można łatwo zaczepić pytony pdb
s na ostatniej napotkanego wyjątek:
import pdb
pdb.pm()
w wyniku czego:
> <ipython-input-11-be791e1071e7>(4)func()
-> warnings.warn('abc', UserWarning)
(Pdb) _________________
Rozpoczyna analizę pośmiertną ostatniego napotkanego wyjątku. Które powinny umożliwić Ci kopać przez ramek i sprawdzić zmienne itp
też poproszony o fladze i rzeczywiście tam jest flaga, która umożliwia obsługę „ostrzegawczy”, to -W
flag. To bardzo przypomina funkcję warnings.filterwarnings
. Dla wygody po prostu kopiowane z dokumentacją -W
flagą tutaj:
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.
OK, rozumiem. AFAIK to tak zwane łatanie małp. Tak, myślę, że usercustomize.py jest dobrym miejscem do łatania małp w ten sposób. Dziękuję Ci. – guettli
@guettli, jest monkeypatching. Chociaż może to być uzasadniony przypadek użycia go, biorąc pod uwagę, że źródło nie może zostać zmienione, a ingerencja nie zmienia żadnej logiki - po prostu skutecznie dodaje więcej rejestrowania. – RebelWithoutAPulse