Использование contextmanager в Python 3 (я не проверял Python 2) имеет странное поведение в отношении переменных, объявленных в области действия в предложении with
.
Мне кажется, что переменные ведут себя как «пугающее действие на расстоянии» в том смысле, что только при наблюдении они кажутся существующими ( шутка от не-физически подкованного инженера ).
Внутри контекста менеджеров контекста после предела доходности:
Если вы ...
- распечатаете
locals()
, тогда переменная не Существуют.
Но если вы:
- распечатываете
locals()
; - делаете что-либо с переменной управляемой области действия
ТОГДА ПЕРЕМЕННОЕ СУЩЕСТВУЕТ !!
См. Этот пример:
from contextlib import contextmanager
def groucho():
@contextmanager
def groucho_manager(**kwargs):
yield
print("groucho_manager locals", locals())
a
with groucho_manager(lolcat=10):
a = 50
def harpo():
@contextmanager
def harpo_manager(**kwargs):
yield
print("harpo_manager locals", locals())
with harpo_manager(lolcat=10):
b = 100
groucho()
harpo()
выходы:
groucho_manager locals {'kwargs': {'lolcat': 10}, 'a': 50}
harpo_manager locals {'kwargs': {'lolcat': 10}}
Возможно, связано с Python наследование класса - жуткое действие , но я не уверен.