使用导入的模块来引用嵌套模块

时间:2017-06-19 12:48:25

标签: python

我是Python新手,但我认为我理解import语句是如何工作的;以下示例证明我没有。

# Works
from sklearn import tree
classifier = tree.DecisionTreeClassifier()

# Doesn't work
import sklearn
classifier = sklearn.tree.DecisionTreeClassifier()
# Error: AttributeError: module 'sklearn' has no attribute 'tree'

由于tree本身是另一个模块,我无法使用点语法访问它?即使" from x import y"是规范方法,是 only 选项吗?

1 个答案:

答案 0 :(得分:3)

导入模块时,Python会查找模块。它可以是“包”,它是具有__init__.py文件的任何目录。此文件作为目录名称导入。

__init__.py文件中,您通常会:

import name.sub_package.module_a
import name.sub_package.module_b
import name.module_c

导入包中的其余模块,因此可以直接使用它们。有时候,特别是对于更大的模块,包作者可能会决定不缩短加载时间,因为Python必须加载更少的模块。这意味着当你这样做时:

from sklearn import tree

我假设包看起来有点像这样:

sklearn/
    __init__.py
    tree/
        __init__.py

导入sklearn/__init__.py,发现没有tree,然后导入sklearn/tree/__init__.pytree

但是,显然__init__.py没有import sklearn.tree,因为导入它时无法找到它。

要解决此问题,请手动导入:

import sklearn.tree
classifier = sklearn.tree.DecisionTreeClassifier()