为啥python中会出现这个AttributeError?
Posted
技术标签:
【中文标题】为啥python中会出现这个AttributeError?【英文标题】:Why does this AttributeError in python occur?为什么python中会出现这个AttributeError? 【发布时间】:2012-01-31 13:14:10 【问题描述】:有一件事我不明白。
为什么会这样
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'
【问题讨论】:
这有什么麻烦?如果模块中不存在sparse
,您期望会发生什么?
我没有意识到,sparse 是 scipy 的 子模块,子模块是 not 自动导入的- 正如@David Zaslavsky 在下面指出的那样。
投反对票的人应该解释他们投反对票的原因,我看不出这个问题有什么问题。其实我觉得这是一个很好的问题
感谢@julio.alegria,很高兴听到其他人的消息。 :-)
【参考方案1】:
这是因为scipy
模块没有任何名为sparse
的属性。只有在您 import scipy.sparse
时才会定义该属性。
import scipy
不会自动导入子模块;您需要明确导入它们。大多数包也是如此,尽管包可以根据需要选择导入自己的子模块。 (例如,如果 scipy/__init__.py
包含语句 import scipy.sparse
,则每当您导入 scipy
时,都会导入 sparse
子模块。)
【讨论】:
我不知道,子模块不会自动导入。谢谢! 子模块是否自动导入实际上取决于包。 @Ethan:是的,我在答案中编辑了一个注释。 我认为值得注意的主要原因是存在不区分大小写的文件系统(即 Windows)。在这样的系统上,很难知道是否应该将文件“sparse.py”作为名为@987654329@、Sparse
、甚至SParse
或sParse
的模块导入(如果它有什么需要做解析 S 表达式,也许)。 Python 选择通过要求显式导入告诉它正确的名称(在您的程序中或在包 __init__.py
中)来保证在区分大小写和不区分大小写的文件系统上的一致行为。
@Ben,我觉得你的回答是这个问题的最佳答案。【参考方案2】:
因为你导入的是 scipy,而不是稀疏的。试试from scipy import sparse
?
【讨论】:
这是什么时候改变的?曾经能够4到sp.sparse【参考方案3】:AttributeError 在对象的属性不可用时引发。
attribute reference 是一个主要的,后跟一个句点和一个名称:
attributeref ::= 主要“。”标识符
要返回该对象的有效属性列表,请使用dir()
,例如:
dir(scipy)
所以你可能需要做的很简单:import scipy.sparse
【讨论】:
【参考方案4】:Python 中的默认命名空间是"__main__"
。当您使用import scipy
时,Python 会创建一个单独的命名空间作为您的模块名称。
Pyhton 中的规则是:当你想从另一个命名空间调用一个属性时,你必须使用完全限定的属性名。
【讨论】:
以上是关于为啥python中会出现这个AttributeError?的主要内容,如果未能解决你的问题,请参考以下文章