Подтвердить что ты не робот

Как получить предупреждения .warn выпустить предупреждение и не игнорировать строку?

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

Официальный

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

Шахта

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

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

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

4b9b3361

Ответ 1

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

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

  • Неактивные предупреждения и PendingDeprecationWarning и 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

Ответ 2

Модуль предупреждений реализует фильтрацию предупреждений на основе определенных условий. Вы можете показать фильтры по умолчанию, напечатав 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 параметре командной строки на 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

Ответ 3

$ 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