2014-01-06 2 views
13

Я пытаюсь поднять DeprecationWarning с помощью фрагмента кода на примере, показанном в документах. http://docs.python.org/2/library/warnings.html#warnings.warnКак мне получить предупреждение.warn, чтобы выпустить предупреждение и не игнорировать строку?

Официальный

def deprecation(message): 
    warnings.warn(message, DeprecationWarning, stacklevel=2) 

Mine

import warnings 
warnings.warn("This is a warnings.", DeprecationWarning, stacklevel=2) is None # returns True 

Я попытался удалить stacklevel аргумент, установив его на отрицательный, 0, 2 и 20000. Предупреждение всегда молча проглотил. Он не выдает предупреждение или не создает исключение. Он просто игнорирует строку и возвращает None. В документах не упоминаются критерии игнорирования. Предоставление сообщения, делает предупреждения. Правильно выдает предупреждение. Userwarning.

Что может быть причиной этого и как я могу получить предупреждение для предупреждения?

ответ

16

Из документов:

По умолчанию, Python устанавливает несколько предупредительных фильтров, которые могут быть переопределены параметрами командной строки, передаваемых -W и вызовы filterwarnings().

  • Устаревшие предупреждения и ожидающие предупрежденияПредставление предупреждения и ImportWarning игнорируются.
  • BytesWarning игнорируется, если параметр -b не задан один или два раза; в этом случае это предупреждение либо напечатано (-b), либо превращено в исключение (-bb).

По умолчанию DeprecationWarning игнорируется. Вы можете изменить фильтры, используя следующие:

warnings.simplefilter('always', DeprecationWarning) 

Теперь ваши предупреждения должны быть напечатаны:

>>> import warnings 
>>> warnings.simplefilter('always', DeprecationWarning) 
>>> warnings.warn('test', DeprecationWarning) 
/home/guest/.env/bin/ipython:1: DeprecationWarning: test 
    #!/home/guest/.env/bin/python 
+4

Я вижу. Я не уверен, что согласен с этим решением изменить его от громкого до не-громкого в 2.7. По умолчанию пользователям следует сообщать, когда ситуация меняется, поэтому они не пойманы полностью не осознавая. Благодарю. – Damgaard

+0

@ Damgaard: пользователям все равно, пока это работает. Это предупреждение для разработчиков, которые в любом случае должны тестироваться с помощью '-W all' или' -W once'. – naught101

5

Модуль предупреждений реализует фильтрацию предупреждений на основе определенных условий. Можно показать фильтры по умолчанию, напечатав warnings.filters:

$ python -c "import warnings; print warnings.filters" 
[('ignore', None, <type 'exceptions.DeprecationWarning'>, None, 0), 
('ignore', None, <type 'exceptions.PendingDeprecationWarning'>, None, 0), 
('ignore', None, <type 'exceptions.ImportWarning'>, None, 0), 
('ignore', None, <type 'exceptions.BytesWarning'>, None, 0)] 

Как вы можете видеть, DeprecationWarning игнорируется по умолчанию. Вы можете использовать функции в модуле warnings и -W command-line option на Python для настройки фильтров. Подробнее см. Документацию.

Пример:

$ python -Wall 
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import warnings 
>>> warnings.warn("test", DeprecationWarning) 
__main__:1: DeprecationWarning: test 
+0

Есть ли способ программно включить все предупреждения? (например, не в командной строке?) –

+0

@MarcelWilson Что-то вроде 'warnings.simplefilter (« always »)' (или 'warnings.simplefilter (« default »)', если вы хотите видеть только первое появление каждого предупреждения). Просто прочтите документацию модуля 'warnings' для деталей. –