我想修改模块xyz及其功能:
def modify(fun):
modulename = fun.__module__ # this is string. ok, but not enough
import xyz
modify(xzy.test)
我的问题是如何在xzy
内访问modify
的命名空间。有时
globals()[fun.__module__]
的工作原理。但是如果定义modify
与其他文件不同,我会遇到问题
代码。
答案 0 :(得分:21)
您想从名称中获取模块对象吗?在包含所有当前加载的模块的sys.modules
字典中查找:
import sys
def modify(func):
module = sys.modules[func.__module__]
答案 1 :(得分:19)
使用检查模块:
import inspect
def modify(fun):
module = inspect.getmodule(fun)
这与使用sys.modules
从fun.__module__
轮询模块相同。虽然getmodule
即使fun
没有__module__
属性也会更加努力。
答案 2 :(得分:7)
你可以尝试
modulename = fun.__module__
module = __import__(modulename)
答案 3 :(得分:-5)
您不想这样做。
它不起作用。想象一下,您在模块abc
中定义了一个函数,然后将其导入xyz
。当您致电test.__module__
时,'abc'
将为modify(xyz.test)
。然后,您就会知道更改abc.test
并且最终不会修改xyz.test
!
应该避免修补猴子。愚弄程序的全局状态是不明智的。而不是这样做,为什么你不能只是制作新的,修改过的东西并使用它?