首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入整个python模块不允许使用子模块

导入整个python模块不允许使用子模块
EN

Stack Overflow用户
提问于 2016-07-01 19:13:49
回答 2查看 1.2K关注 0票数 2

我的问题是针对scikit-learn python模块的,但我在matplotlib上也遇到了类似的问题。

当我想使用sklearn时,如果我只是做'import sklearn‘,然后调用我需要的任何子模块,比如’sklearn.preprocessing.scale()',我得到一个错误"AttributeError:‘模块’对象没有属性‘预处理’“

另一方面,当我执行“from sklearn import preprocessing”,然后使用“preprocessing.scale()”时,它可以正常工作。

当我使用像Numpy这样的其他模块时,只需“导入numpy”就足够了,而且它工作得很好。

因此,我想问一问,有没有人可以告诉我为何会这样,以及我是否做错了甚麽?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-07-01 19:22:51

python包在目录内的__init__.py文件中定义。该文件确定是否包含子模块。

当您执行import sklearn操作时,python会找到文件sklearn/__init__.py并执行它来创建sklearn模块。此对象绑定到名称sklearn。解释器不会隐式导入子模块。

但是,在执行from sklearn import preprocessing时,python将像以前一样首先加载sklearn模块。然后,它将检查preprocessing是否是该模块的属性(例如,函数),如果不是,它将查找文件sklearn/preprocessing.py并改进该模块。

碰巧numpy在其__init__.py文件中执行类似以下操作:

代码语言:javascript
复制
import .random

因此,在将numpy.random作为import numpy导入时,该模块的执行会触发numpy的导入,然后将其添加为一个属性。

这很有用,因为有时您只想使用包的一部分,而加载所有包可能需要大量的时间。例如,导入numpy确实需要半秒左右的时间。如果您只需要其功能的一个非常小的子集,那么这是浪费时间。

您可能会对阅读documentation for packages感兴趣。

票数 2
EN

Stack Overflow用户

发布于 2016-07-01 19:21:18

__all__可以方便地在其__init__.py文件中导入其子模块并将其添加到Numpy中。在使用库时,你对此无能为力--它要么做,要么不做。sklearn显然不是这样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38143991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档