为什么python中会出现这种AttributeError?

为什么python中会出现这种AttributeError?,python,import,attributeerror,Python,Import,Attributeerror,有一件事我不明白 为什么会这样 import scipy # happens with several other modules, too. I took scipy as an example now... matrix = scipy.sparse.coo_matrix(some_params) 产生此错误: AttributeError: 'module' object has no attribute 'sparse' 这是因为scipy模块没有任何名为sparse的属性。只有在

有一件事我不明白

为什么会这样

import scipy # happens with several other modules, too. I took scipy as an example now...

matrix = scipy.sparse.coo_matrix(some_params)
产生此错误:

AttributeError: 'module' object has no attribute 'sparse'

这是因为
scipy
模块没有任何名为
sparse
的属性。只有在
导入scipy.sparse
时才能定义该属性


仅导入scipy时,子模块不会自动导入;您需要显式地导入它们。大多数包也是如此,尽管包可以选择导入自己的子模块。(例如,如果
scipy/\uuuuu init\uuuuuu.py
包含一条语句
import scipy.sparse
,则无论何时导入
scipy
)都会导入
sparse
子模块,因为导入的是scipy,而不是sparse>)。尝试从scipy导入稀疏的

在对象的属性不可用时引发

是一个主键,后跟句点和名称:

attributeref::=主“.”标识符

要返回该对象的有效属性列表,请使用,例如:


因此,您可能只需要执行以下操作:
import scipy.sparse

Python中的默认名称空间是
“\uuuuu main\uuuu”
。使用
import scipy
时,Python会创建一个单独的名称空间作为模块名。
Pyhton中的规则是:当你想从另一个名称空间调用一个属性时,你必须使用完全限定的属性名。

这有什么麻烦?如果模块中不存在
sparse
,您预计会发生什么?我没有意识到,sparse是scipy的一个子模块,并且子模块不会自动导入-正如@David Zaslavsky在下面指出的那样。选民应该解释他们为什么投了否决票,我不知道这个问题有什么错。事实上,我认为这是一个非常好的问题谢谢@julio.alegria,很高兴听到别人这么说。:-)我不知道,子模块不会自动导入。谢谢实际上,这取决于软件包是否也自动导入子模块。@Ethan:是的,我在答案中编辑了一条注释,大意是这样的。我认为值得注意的是,主要原因是存在不区分大小写的文件系统(即Windows)。在这样的系统上,可能很难知道文件“sparse.py”是否应该作为名为
sparse
、或
sparse
、甚至
sparse
sparse
的模块导入(如果它可能与解析S表达式有关)。Python选择在区分大小写和不区分大小写的文件系统上保证一致的行为,方法是要求显式导入来告诉它正确的名称(在您的程序或包
\uuuu init\uuuuuuu.py
)?以前可以4到sp稀疏
dir(scipy)