从模块导入 vs 导入大模块 [python]

0 投票
2 回答
676 浏览
提问于 2025-04-18 14:12

出于某种原因,这段代码可以正常运行:

from sklearn import svm

但是这段代码却不行:

import sklearn  

sklearn.svm.LinearSVC()

提示说模块 svm 不是 sklearn 的子模块。

难道它们不应该是一样的吗?

2 个回答

0

第一段代码能正常运行的前提是,svm要么是sklearn中的一个变量,要么是sklearn的一个子模块。

from sklearn import svm

第二段代码只有在sklearn导入了svm,并且把它作为一个变量放在自己的命名空间里时,才能正常运行。

import sklearn
sklearn.svm.LinearSVC()
4

我创建了一个文件系统的结构,如下所示。

[9:29pm][wlynch@watermelon layout] tree
.
├── __init__.py
└── sklearn
    ├── __init__.py
    └── svm
        └── __init__.py

[9:31pm][wlynch@watermelon layout] cat __init__.py 
[9:31pm][wlynch@watermelon layout] cat sklearn/__init__.py
[9:31pm][wlynch@watermelon layout] cat sklearn/svm/__init__.py
def LinearSVC():
    pass

现在我们来运行一下 python

[9:29pm][wlynch@watermelon layout] python
Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sklearn
>>> sklearn.svm
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'svm'

>>> import sklearn.svm
>>> sklearn.svm.LinearSVC()
>>>

通常,设计 Python 库的人会通过在 sklearn/__init__.py 文件中加入一行 import svm 来解决这个问题。

撰写回答