在Python上下文管理器中观察到的怪异动作

问题描述 投票:2回答:1

[在Python 3中使用contextmanager(我没有测试过Python 2)对于with子句的作用域中声明的变量有一些奇怪的行为。

在我看来,这些变量的行为就像是“远距离的怪异动作”,即只有在观察到它们才存在的情况下(来自非物理学精通的工程师的笑话)。]]

在上下文管理器范围内,在屈服点之后:

如果您...

  1. 打印出locals()

    然后变量不存在[[不

但是,如果您:

    打印出locals();
  1. 使用托管范围的变量执行任何操作
  2. 当变量存在时!

请参见此示例:

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子句的范围内声明的变量有一些奇怪的行为。在我看来,变量表现出...

python contextmanager
1个回答
0
投票
我最初的用例是使inner scope aware上下文管理器负责日志记录。

我以为我可以滥用问题中列出的奇怪行为,但正如@jasonharper所指出的:它与嵌套作用域有关,而不是被滥用。

© www.soinside.com 2019 - 2024. All rights reserved.