您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

覆盖从其他模块导入的函数中的全局变量

覆盖从其他模块导入的函数中的全局变量

我已经通过猜测和检查以及研究的结合提出了一个解决方案。您几乎可以完全按照我在问题中的建议进行操作:复制函数对象并替换其__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__被记录为只读?。

其他 2022/1/1 18:31:04 有591人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶