获取Python对象的包

问题描述 投票:0回答:1

给定一个对象或类型,我可以使用

inspect
包获取该对象的模块

示例

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

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

但是我真正想要的是获得与包相对应的顶级模块,在本例中是

numpy
而不是
numpy.core.memmap

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

给定一个对象或模块,如何获取顶层模块?

python introspection
1个回答
4
投票

如果您已经导入了子模块,那么顶层模块也必须已经加载到

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了解更多详情。

© www.soinside.com 2019 - 2024. All rights reserved.