warnings.simplefilter ("always") не заставляет делать предупреждения в Python 2.7 - PullRequest
0 голосов
/ 30 июня 2019

warnings.simplefilter('always') не вызывает повторения предупреждений в Python 2.7. Кажется, имеет тот же эффект, что и 'once'.

Я пытаюсь протестировать код, выдающий предупреждения. В половине случаев предупреждение, которое я пытаюсь проверить, уже было отправлено, поэтому мой тест использует simplefilter(), чтобы убедиться, что предупреждение выдается снова. Эта проблема возникает только в Python 2.7. Все остальные версии работают, как и ожидалось.

Я следовал примеру в документации по Python 2.7 https://docs.python.org/2/library/warnings.html#testing-warnings Пример работает как есть, но если я добавлю вызов к fxn() прямо перед тестовым кодом, предупреждение не появится и len(w) = 0 вместо 1.

В частности,

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

fxn()

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)

Ожидаемый результат - запуск до конца без вывода. Фактический результат в Python 2.7.14 и 2.7.15:

Traceback (most recent call last):
  File "warntest.py", line 14, in <module>
    assert len(w) == 1
AssertionError

Update : Я также обнаружил, что вызов warnings.resetwarnings() после выдачи первого предупреждения не работает.

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

fxn()
warnings.resetwarnings()

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a warning.
    fxn()
    # Verify some things
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)

fxn()

Результат:

Traceback (most recent call last):
  File "warntest.py", line 15, in <module>
    assert len(w) == 1
AssertionError

1 Ответ

0 голосов
/ 06 июля 2019

Это определенно ошибка в Python 2.7, но я реализовал обходной путь, основываясь на рекомендации Тома. Обходной путь заставляет мои модульные тесты выдавать массу предупреждений для Python 2.7, но он проходит. В основном, когда основной версией Python является 2, я добавил

warnings.simplefilter('always')

до начала теста, и я пропускаю человека

warnings.simplefilter('ignore')

Я имел в тестах, которые вызывают предупреждения, которые следует игнорировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...