从 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
的真实副本。
是否可以从 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
的真实副本。