获取Python对象的包

时间:2017-04-18 02:41:05

标签: python introspection

给定一个对象或类型,我可以使用inspect包来获取对象的模块

实施例

在这里,给定一个函数,我得到包含该函数的模块:

>>> inspect.getmodule(np.memmap)
<module 'numpy.core.memmap' from ...>

然而,我真正想要的是获得与包对应的顶级模块,在这种情况下是numpy而不是numpy.core.memmap

>>> function_that_I_want(np.memmap)
<module 'numpy' from ...>

给定一个对象或模块,如何获得顶级模块?

1 个答案:

答案 0 :(得分:2)

如果您已导入子模块,那么顶级模块也必须已加载到sys.modules中(因为这是导入系统的工作方式)。所以,像这样愚蠢和简单的东西应该是可靠的:

import sys, inspect

def function_that_I_want(obj):
    mod = inspect.getmodule(obj)
    base, _sep, _stem = mod.__name__.partition('.')
    return sys.modules[base]

模块的__package__属性对您(或未来的读者)可能也很有趣。对于子模块,这是一个设置为父包名称的字符串(不一定是顶级模块名称)。有关详细信息,请参阅PEP366