如何修改python中的本地命名空间

2024-05-07

如何修改Python中函数的本地命名空间?我知道 locals() 在函数内部调用时返回函数的本地命名空间,但我想做这样的事情(我有一个原因为什么我想在 f 无法访问 g 的情况下执行此操作,但给出更快一个简单的、愚蠢的例子来说明问题):

def g():
   pass

def f():
    g()

f.add_to_locals({'g':g})

你有几个选择。首先,请注意,示例中的 g 实际上并不是函数的局部变量(即未在其中分配),而是全局变量(即尚未分配给局部变量)。这意味着它将在定义该函数的模块中查找它。这是幸运的,因为无法在外部更改局部变量(除非修补字节码),因为它们是在函数运行时而不是之前分配的。

一种选择是将函数注入到函数模块的命名空间中。这会起作用,但会影响该模块中访问该变量的每个函数,而不仅仅是一个函数。

要仅影响一个函数,您需要将该 func_globals 指向其他位置。不幸的是,这是一个只读属性,但您可以通过使用相同的主体但不同的全局命名空间重新创建函数来执行您想要的操作:

import new
f = new.function(f.func_code, {'g': my_g_function}, f.func_name, f.func_defaults, f.func_closure)

f 现在将是相同的,只是它将在提供的字典中查找全局变量。请注意,这绑定了整个全局名称空间 - 如果那里有变量,则 fdoes查一下,确保你也提供了它们。不过,这也相当 hacky,并且可能不适用于 cpython 之外的 python 版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修改python中的本地命名空间 的相关文章

随机推荐