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



我的问题特定于scikit-learn python模块,但我在matplotlib上也有类似的问题。

当我想使用 sklearn 时,如果我只执行"导入 sklearn",然后调用我需要的任何子模块,例如"sklearn.preprocessing.scale((",我会收到一个错误"属性错误:"模块"对象没有属性"预处理">

另一方面,当我做"从 sklearn 导入预处理"时然后使用'preprocessing.scale(('它正常工作。

当我使用其他模块(如 Numpy(时,只需"导入 numpy"就足够了,而且效果很好。

因此,我想问是否有人可以告诉我为什么会发生这种情况,如果我做错了什么?

谢谢。

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

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

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

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

import .random

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


这很有用,因为有时您只想使用包的一部分,并且加载所有包可能需要大量时间。例如,导入numpy确实需要半秒钟。如果您只需要其功能的一小部分,这是浪费时间的。


您可能有兴趣阅读包的文档。

Numpy 方便地将其子模块导入其__init__.py文件中并将它们添加到__all__ 中。使用库时,您无能为力 - 它要么做,要么不做。

相关内容

  • 没有找到相关文章

最新更新