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