为啥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”作为名为@9​​87654329@、Sparse、甚至SParsesParse 的模块导入(如果它有什么需要做解析 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?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Eclipse 中会出现重复的方法建议?

为啥 Stackdriver 日志中会间歇性出现空行?

为啥 Corona sdk 中会出现此错误?

为啥 SQL 结果中会出现重复值

为啥在 PageViewController 中会出现这种类型的滚动?

为啥 ElasticSearch Nest Query 中会出现转义反斜杠?