[在Python 3中使用contextmanager(我没有测试过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 class inheritance - spooky action有关,但我不确定。
在Python 3中使用contextmanager(我还没有测试Python 2)在with子句的范围内声明的变量有一些奇怪的行为。在我看来,变量表现出...
inner scope aware
上下文管理器负责日志记录。我以为我可以滥用问题中列出的奇怪行为,但正如@jasonharper所指出的:它与嵌套作用域有关,而不是被滥用。