Почему в Python предупреждения не отображаются при использовании `eval`?

#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)