我已经通过猜测和检查以及研究的结合提出了一个解决方案。您几乎可以完全按照我在问题中的建议进行操作:复制函数对象并替换其__globals__
属性。
我正在使用Python 3,因此这是上面链接的问题的答案的修改后的版本,带有一个覆盖全局变量的附加选项:
import copy
import types
import functools
def copy_func(f, globals=None, module=None):
"""Based on https://stackoverflow.com/a/13503277/2988730 (@unutbu)"""
if globals is None:
globals = f.__globals__
g = types.FunctionType(f.__code__, globals, name=f.__name__,
argdefs=f.__defaults__, closure=f.__closure__)
g = functools.update_wrapper(g, f)
if module is not None:
g.__module__ = module
g.__kwdefaults__ = copy.copy(f.__kwdefaults__)
return g
from a import x
value = 4
x = copy_func(x, globals(), __name__)
该__globals__
属性是只读的,因此必须将其传递给的构造函数FunctionType
。__globals__
现有功能对象的引用不能更改:为什么func .__ globals__被记录为只读?。