Как узнать, откуда стоит предупреждение Python
Я все еще новичок в Python, используя Pandas, и у меня есть некоторые проблемы, отлаживающие мой Python script.
У меня есть следующее предупреждающее сообщение:
[...]\pandas\core\index.py:756: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
return self._engine.get_loc(key)
И не может найти, откуда он.
После некоторых исследований я попытался сделать это в файле Pandas lib (index.py):
try:
return self._engine.get_loc(key)
except UnicodeWarning:
warnings.warn('Oh Non', stacklevel=2)
Но это ничего не изменило в предупреждении.
Ответы
Ответ 1
Вы можете фильтровать предупреждения для повышения, которые позволят вам отлаживать (например, с помощью pdb):
import warnings
warnings.filterwarnings('error')
* Фильтр предупреждений может управляться более тонко (что, вероятно, более подходит), например:
warnings.filterwarnings('error', category=UnicodeWarning)
warnings.filterwarnings('error', message='*equal comparison failed*')
Несколько фильтров будут последовательно просматриваться. ( "Записи ближе к фронту списка переопределяют записи позже в списке, если оба соответствуют конкретному предупреждению".)
Ответ 2
Вы также можете использовать командную строку для управления предупреждениями:
python -W error::UnicodeWarning your_code.py
На странице man:
-W аргумент
[...] ошибка, чтобы создать исключение вместо печати предупреждающего сообщения.
Это будет иметь такой же эффект, как и следующее:
import warnings
warnings.filterwarnings('error', category=UnicodeWarning)
Как уже было сказано в ответе Энди.
Ответ 3
Если вы включите ведение журнала на python, то, когда получено исключение, вы можете использовать метод logging.exception
для регистрации, когда было обнаружено исключение - этот метод распечатает красиво отформатированную трассировку стека, которая точно отобразит вас в коде где возникло исключение. Подробнее см. документ python при регистрации.
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')
В качестве альтернативы вы можете получить кортеж, содержащий сведения об исключении в вашем коде, вызывая sys.exc_info()
(для этого требуется импортировать модуль sys
).