sklearn是一个包。这个答案很简洁地说:
当您导入软件包时,仅
__init__.py该软件包文件中的变量/函数/类是直接可见的,子软件包或模块则不可见。
datasets是的子包
sklearn。这就是为什么发生这种情况:
In [1]: import sklearnIn [2]: sklearn.datasets---------------------------------------------------------------------------AttributeError Traceback (most recent call last)<ipython-input-2-325a2bfc35d0> in <module>()----> 1 sklearn.datasetsAttributeError: module 'sklearn' has no attribute 'datasets'
但是,这样做的原因:
In [3]: from sklearn import datasetsIn [4]: sklearn.datasetsOut[4]: <module 'sklearn.datasets' from '/home/ethan/.virtualenvs/test3/lib/python3.5/site-packages/sklearn/datasets/__init__.py'>
就是当您
datasets通过执行子程序加载子程序包时,
from sklearn importdatasets它会自动添加到程序包的名称空间中
sklearn。这是Python导入系统中鲜为人知的“陷阱”之一。
另外,需要注意的是,如果你看
__init__.py的
sklearn,你 会
看到
'datasets'其中的一名成员
__all__,但这只让你做:
In [1]: from sklearn import *In [2]: datasetsOut[2]: <module 'sklearn.datasets' from '/home/ethan/.virtualenvs/test3/lib/python3.5/site-packages/sklearn/datasets/__init__.py'>
最后要注意的一点是,如果您检查了其中一个,
sklearn或者
datasets将会看到,尽管它们是包装,但它们的类型是
module。这是因为所有软件包都被视为模块-
但是,并非所有模块都是软件包。



