从 Python 中的导入模块替换主模块中的函数

Replace function in main module from imported module in Python

是否可以从 python 中导入的模块(使用字符串)在主模块中设置全局变量?

(是的,我知道这不是最佳做法。)

最终我希望它看起来像这样:

main.py

import mod
def func():
  print('failure')
mod.run(func)
func()

mod.py

def func2():
    print('success')
def run(f):
    globals()[f.__name__] = func2

结果是'failure'因为全局是相对于模块的。

我想用模块中的 func2 覆盖变量 func

另一个警告:变量 func 发生变化,所以我需要将其引用为 f.__name__ string

我知道如果 func 的名称在通过 mod.run(func) 更改之前更改,则此方法将不起作用。

我的问题:是否可以在不更改上面示例中的代码的情况下,从导入的模块更改主模块中的功能main.py?如果是,怎么做?

与其更改名称 func 绑定到的内容,不如更改函数 func 绑定到实际执行的代码。

def func2():
    print('success')
def run(f):
    f.__code__ = func2.__code__

这修改了 func 引用的实际函数对象,并且仅部分使用了上面的代码,因此可能需要进一步的手术(例如将 func.__name__ 更新为 func2 func),你可能想在像这样猴子修补它之前制作 func 的真实副本。