Как узнать, откуда стоит предупреждение Python - программирование
Подтвердить что ты не робот

Как узнать, откуда стоит предупреждение 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)

Но это ничего не изменило в предупреждении.

4b9b3361

Ответ 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).