为什么要在局部范围内执行代码只是为了更新全局范围?
Why would you execute code in a local scope just to update the global scope?
在 pkg_resources
模块中你有这个奇怪的函数:
@_call_aside
def _initialize_master_working_set():
# A bunch of ugly code, and then finally:
globals().update(locals())
_call_aside
是这样定义的装饰器,它在定义时调用一次函数(为什么要用装饰器来做而不是简单地显式调用函数,我不知道):
def _call_aside(f, *args, **kwargs):
f(*args, **kwargs)
return f
函数 _initialize_master_working_set
未在其他任何地方调用,名称上的下划线表明它不适合 public 重复使用。文档字符串进一步警告不要调用:
This function ... is intended to be invoked once at the initialization of this module.
Invocation by other packages is unsupported
我不明白。这不就是在模块范围内执行 "A bunch of ugly code" 的混淆方式吗?这种模式与直接在全局范围内执行代码有何不同?
Git blame 出现了一个 commit message with a link to an issue 激发了这个函数的引入。有人想要一种重新运行此初始化的方法,因此他们将其提取到一个可以重复调用的函数中。
此函数的行为与旧版本没有任何不同,旧版本的代码在模块级别。虽然在某些情况下,末尾带有 globals().update(locals())
的函数与 运行 直接在全局范围内的代码的行为不同(例如,如果其他东西在函数中间重新绑定相同的全局名称, 该功能将在最后踩踏这些更改),这不是引入此功能的动机。他们只是希望能够按需重新运行它。
在 pkg_resources
模块中你有这个奇怪的函数:
@_call_aside
def _initialize_master_working_set():
# A bunch of ugly code, and then finally:
globals().update(locals())
_call_aside
是这样定义的装饰器,它在定义时调用一次函数(为什么要用装饰器来做而不是简单地显式调用函数,我不知道):
def _call_aside(f, *args, **kwargs):
f(*args, **kwargs)
return f
函数 _initialize_master_working_set
未在其他任何地方调用,名称上的下划线表明它不适合 public 重复使用。文档字符串进一步警告不要调用:
This function ... is intended to be invoked once at the initialization of this module. Invocation by other packages is unsupported
我不明白。这不就是在模块范围内执行 "A bunch of ugly code" 的混淆方式吗?这种模式与直接在全局范围内执行代码有何不同?
Git blame 出现了一个 commit message with a link to an issue 激发了这个函数的引入。有人想要一种重新运行此初始化的方法,因此他们将其提取到一个可以重复调用的函数中。
此函数的行为与旧版本没有任何不同,旧版本的代码在模块级别。虽然在某些情况下,末尾带有 globals().update(locals())
的函数与 运行 直接在全局范围内的代码的行为不同(例如,如果其他东西在函数中间重新绑定相同的全局名称, 该功能将在最后踩踏这些更改),这不是引入此功能的动机。他们只是希望能够按需重新运行它。