是否可以在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'
,因为全局相对于模块。
我想从模块中用func
覆盖变量func2
。
另一个警告:变量func
发生了变化,因此我需要将其称为f.__name__ string
我知道如果func
的名称在通过mod.run(func)
更改之前已更改,则此方法无效。
我的问题:是否可以从导入的模块更改主模块中的功能,而无需更改上例main.py
中的代码?如果是这样,怎么样?
答案 0 :(得分:3)
您可以更改函数func
必须实际执行的代码,而不是更改名称func
绑定的内容。
def func2():
print('success')
def run(f):
f.__code__ = func2.__code__
这会修改func
引用的实际功能对象,并且仅部分使用上面的代码,因此可能需要进一步的手术(例如,将func.__name__
更新为func2
而不是{ {1}}),您可能希望在猴子修补之前制作func
的真实副本。