In numpy we can do np.seterr(invalid='raise')
to get a traceback for warnings raising an error instead (see this post).
- Is there a general way for tracing warnings?
- Can I make python to give a traceback, when a warning is raised?
In numpy we can do np.seterr(invalid='raise')
to get a traceback for warnings raising an error instead (see this post).
You can get what you want by assigning to
warnings.showwarning
. The warnings module documentation itself recommends that you do that, so it's not that you're being tempted by the dark side of the source. :)You can define a new function that does what
warning.showwarning
normaly does and additionally it prints the stack. Then you place it instead of the original:After this, every warning will print the stack trace as well as the warning message. Take into account, however, that if the warning is ignored because it is not the first one, nothing will happen, so you still need to execute:
You can get a similar control that the one
numpy.seterr
gives through thewarning
module's filtersIf what you want is python to report every a warning every time it is triggered and not only the first time, you can include something like:
You can get other behaviours by passing different strings as arguments. Using the same function you can also specify different behaviours for warnings depending on the module that raised them, the message they provide, the warning class, the line of code that is causing it and so on...
You can check the list in the module documentation
As an example, you can set all the warnings to raise exceptions, except the
DeprecationWarnings
that should be ignored completely:This way you get the full traceback for each warning raised as error (only the first one, since execution will stop... but you can address them one by one, and create a filter to ignore the ones you don't want to hear about again...
Run your program like
This makes all warnings fatal, see here for more information