为什么在本地作用域中执行代码只是为了更新全局作用域



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在其他任何地方都不会被调用,名称上的下划线表明它不打算用于公共重用。docstring进一步警告不要调用:

此函数。。。旨在在此模块初始化时调用一次。不支持其他程序包调用

我不明白。这不是在模块范围内执行"一堆丑陋的代码"的一种模糊方式吗?这种模式与直接在全局范围内执行代码有何不同?

Git指责会出现一条提交消息,其中包含一个链接,指向导致该函数引入的问题。有人想要一种重新运行初始化的方法,所以他们将其提取到一个可以重复调用的函数中。

此函数的行为与旧版本没有任何不同,旧版本的代码处于模块级别。虽然在某些情况下,结尾带有globals().update(locals())的函数的行为与直接在全局范围内运行代码不同(例如,如果其他东西在函数中间重新绑定了相同的全局名称,则该函数将在结尾处踩踏这些更改(,但这并不是引入该函数的动机。他们只是希望能够按需重新运行。

相关内容

  • 没有找到相关文章

最新更新