How to find out where a Python Warning is from

Question:

I’m still kinda new with Python, using Pandas, and I’ve got some issues debugging my Python script.

I’ve got the following warning message :

[...]pandascoreindex.py:756: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
return self._engine.get_loc(key)

And can’t find where it’s from.

After some research, I tried to do that in the Pandas lib file (index.py):

try:
    return self._engine.get_loc(key)
except UnicodeWarning:
    warnings.warn('Oh Non', stacklevel=2)

But that didn’t change anything about the warning message.

Asked By: Bonswouar

||

Answers:

If you enable logging in python, then when an exception is received you can use the method logging.exception to log when an exception has been caught – this method will print out a nicely formatted stack trace that shows you exactly in the code where the exception originated. See the python document on logging for more information.

import logging
log = logging.getLogger('my.module.logger')

try:
    return self._engine.get_loc(key)
except UnicodeWarning:
    log.exception('A log message of your choosing')

Alternatively, you can get a tuple that contains details of the exception in your code by calling sys.exc_info() (this requires you to import the sys module).

Answered By: robjohncox

You can filter the warnings to raise which will enable you to debug (e.g. using pdb):

import warnings
warnings.filterwarnings('error')

*The warnings filter can be managed more finely (which is probably more appropriate) e.g.:

warnings.filterwarnings('error', category=UnicodeWarning)
warnings.filterwarnings('error', message='*equal comparison failed*')

Multiple filters will be looked up sequentially. (“Entries closer to the front of the list override entries later in the list, if both match a particular warning.”)

Answered By: Andy Hayden

You can also use the commandline to control the warnings:

python -W error::UnicodeWarning your_code.py

From the man page:

-W argument
[…] error to raise an exception instead of printing a warning message.

This will have the same effect as putting the following in your code:

import warnings
warnings.filterwarnings('error', category=UnicodeWarning)

As was already said in Andy’s answer.

Answered By: Maxime R.

The most informative way to investigate a warning is to convert it into an error (Exception) so you can see its full stacktrace:

import warnings
warnings.simplefilter("error")

See warnings.

Answered By: Arthur
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.