在Python中导入模块替换主模块中的功能

时间:2015-04-19 16:06:19

标签: python python-3.x python-import

是否可以在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中的代码?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:3)

您可以更改函数func必须实际执行的代码,而不是更改名称func绑定的内容。

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

这会修改func引用的实际功能对象,并且仅部分使用上面的代码,因此可能需要进一步的手术(例如,将func.__name__更新为func2而不是{ {1}}),您可能希望在猴子修补之前制作func的真实副本。