2015-08-05 4 views
1

Я использую это, чтобы вызывать предупреждения при анализе файла конфигурации. При этом могут произойти всевозможные ошибки, некоторые из которых являются фатальными, а некоторые - нет. Все эти нефатальные ошибки не должны прерывать разбор, но они также не должны выходить из внимания пользователя. Здесь модуль предупреждения приходит вЯ использую модуль «предупреждений»?

Я сейчас делаю это (псевдокод):.

while parsing: 
    try: 
     get dictionary["token"] 
    except KeyError: 
     warnings.warn("Looks like your config file don't have that token") 

Это все выглядит читаемым и уютно, но сообщение выглядит примерно так:

C:\Users\Renae\Documents\test.py:3: UserWarning: Looks like your config file don't have that token 
    warnings.warn("Looks like your config file don't have that token") 

Почему он печатается дважды? Должен ли я выполнять какую-либо инициализацию перед выдачей предупреждений (например, модуля протоколирования)? В стандартных документах нет учебника об этом (или нет?).

Что отличает предупреждения от print(), stdout или stderr?

ответ

2

Когда вы используете модуль warnings, вторая печать на самом деле является стеком, вы можете контролировать уровень, который вы хотите распечатать, используя аргумент stacklevel. Пример -

import warnings 
def warn(): 
    warnings.warn("Blah",stacklevel=2) 

warn() 

В результате -

a.py:6: UserWarning: Blah 
    warn() 

Если вы установите его на несуществующий уровне, в приведенном выше примере позволяет говорить 3, то он не печатает стек, пример -

def warn(): 
    warnings.warn("Blah",stacklevel=3) 

Результат -

sys:1: UserWarning: Blah 

Хотя, как вы можете видеть, файл также изменился на sys:1. Возможно, вы захотите показать там стек значений (возможно, что-то вроде stacklevel = 2 для вызывающей функции, в которой было поднято предупреждение).

Другой способ подавить это будет использовать метод warnings.warn_explicit() и передать вручную имя файла и linenumber (у linenumber не должно быть никакого реального кода, иначе этот код будет напечатан), хотя я не советую этому.


Кроме того, да при использовании warnings модуля, данные обычно переходит в sys.stderr, но вы также можете легко отправить предупреждение другого файл, используя различные функции, такие как - warnings.showwarning()

Смежные вопросы