#python #warnings #eval
#python #предупреждения #eval
Вопрос:
Следующий код выводит предупреждение, как и ожидалось:
>>> import warnings
>>> def f():
... warnings.warn('Deprecated', DeprecationWarning)
... print('In function f()')
...
>>> f()
__main__:2: DeprecationWarning: Deprecated
In function f()
Однако при использовании eval
предупреждающее сообщение не отображается:
>>> eval('f()')
In function f()
Почему предупреждения ведут себя по-разному в этих двух ситуациях?
Комментарии:
1. Я предполагаю, что Eval может запускать эту функцию в мини-экземпляре, в котором отсутствует модуль warnings, но это только мое предположение.
Ответ №1:
Почему предупреждения ведут себя по-разному в этих двух ситуациях?
Они этого не делают. Из документов:
Повторения конкретного предупреждения для одного и того же исходного местоположения обычно подавляются.
import warnings
def f():
warnings.warn("dep", DeprecationWarning)
print('in f')
f()
warnings.resetwarnings()
eval('f()')
Или:
import warnings
def f():
warnings.warn("dep", DeprecationWarning)
print('in f')
# don't call f()
#f()
eval('f()')
Оба показывают предупреждение от eval('f()')
вызова:
# with warnings.resetwarnings() between f() and eval('f()')
in f
/home/gir/local/dev/pcws/local/main.py:7: DeprecationWarning: dep
in f
warnings.warn("dep", DeprecationWarning)
/home/gir/local/dev/pcws/local/main.py:7: DeprecationWarning: dep
warnings.warn("dep", DeprecationWarning)
# without calling f() directly
/home/gir/local/dev/pcws/local/main.py:5: DeprecationWarning: dep
in f
warnings.warn("dep", DeprecationWarning)