获取函数对应的模块

50 投票
4 回答
34368 浏览
提问于 2025-04-16 23:23

我想修改一个叫做xyz的模块和它的一些功能,像这样:

def modify(fun):
    modulename = fun.__module__ # this is string. ok, but not enough

import xyz
modify(xzy.test)

我遇到的问题是,如何在modify这个函数里访问xyz的命名空间。有时候

globals()[fun.__module__]

这样做是可以的。但如果modify的定义在一个和其他代码不同的文件里,我就会遇到问题。

4 个回答

13

你可以试试这个

modulename = fun.__module__
module = __import__(modulename)
51

使用inspect模块:

import inspect

def modify(fun):
    module = inspect.getmodule(fun)

这和通过sys.modules来查看模块,使用fun.__module__是一样的。不过,getmodule会更加努力地去查找,即使fun没有__module__这个属性。

36

你想通过名字获取模块对象吗?可以在 sys.modules 这个字典里查找,它里面包含了所有当前加载的模块:

import sys

def modify(func):
    module = sys.modules[func.__module__]

撰写回答