Python中的ModuleWrapper究竟是什么?

时间:2018-01-10 11:25:54

标签: python module

这可能是有史以来最基本的问题,但最近我试图更好地理解输入类似内容:

model = statsmodels.regression.linear_model.OLS(y, X).fit()

完全正确。试图理解基本原理,而不是去,如果我输入我可以拟合线性最小二乘回归模型,那么我只需要在每次需要时输入。所以现在我试图在更彻底的层面上理解它。所以我开始使用了?更多,我发现:

statsmodels是库

回归是ModuleWrapper

linear_model是模块

OLS是类型/类

fit是与OLS类型实例关联的方法

所以我的问题是这样,ModuleWrapper究竟是什么?我不敢相信我已经无法通过搜索找到答案了,对此抱歉,但是它可能就像它只是几个不同模块的包/包装一样简单吗?

感谢。

1 个答案:

答案 0 :(得分:0)

regression是包含多个模块的statsmodels的文件夹或子目录

定义OLS类的模块的完整文件路径是

...\statsmodels\regression\linear_model.py

但是,python不要求路径对应于实际的目录,文件或模块。

使用api导入import statsmodels.api时,访问的python路径与磁盘上的文件不对应。

e.g。 statmodels\api.py包含

from .genmod.api import families, cov_struct

...\statsmodels\genmod\api.py包含来自实际模块或子目录的导入

from . import families
from . import cov_struct

例如,我们可以使用api快捷方式访问Poisson系列,而定义类的实际模块具有不同的更长路径。

>>> import statsmodels.api as sm

>>> sm.families.Poisson
<class 'statsmodels.genmod.families.family.Poisson'>
>>> sm.families.Poisson.__module__
'statsmodels.genmod.families.family'

直接从包含Poisson系列代码的模块导入

>>> import statsmodels.genmod.families.family
>>> statsmodels.genmod.families.family.Poisson
<class 'statsmodels.genmod.families.family.Poisson'>

因此,路径中的名称有时会引用实际的文件路径,而在其他情况下,它是通过中间模块的间接导入,并不符合实际的目录结构。

简要说明statsmodels使用此双重导入结构的原因在http://www.statsmodels.org/devel/importpaths.html