Почему возникает эта ошибка AttributeError в Python?

Я не понимаю одного.

Почему это

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'

person Aufwind    schedule 01.01.2012    source источник
comment
Что в этом такого надоедливого? Что вы ожидаете, если sparse не существует в модуле?   -  person Paul Manta    schedule 02.01.2012
comment
Я не осознавал, что sparse - это подмодуль scipy, и что подмодули не импортируются автоматически - как @David Zaslavsky указал ниже .   -  person Aufwind    schedule 02.01.2012
comment
Те, кто проголосовали против, должны объяснить, почему они проголосовали против, я не понимаю, что не так с этим вопросом. На самом деле, я думаю, это очень хороший вопрос   -  person juliomalegria    schedule 02.01.2012
comment
Спасибо @ julio.alegria, приятно слышать это от другого человека. :-)   -  person Aufwind    schedule 02.01.2012


Ответы (4)


Это происходит потому, что модуль scipy не имеет атрибута с именем sparse. Этот атрибут определяется только тогда, когда вы import scipy.sparse.

Подмодули не импортируются автоматически, если вы просто import scipy; вам нужно импортировать их явно. То же самое справедливо для большинства пакетов, хотя пакет может выбрать импорт своих собственных подмодулей, если захочет. (Например, если scipy/__init__.py включил оператор import scipy.sparse, тогда подмодуль sparse будет импортирован всякий раз, когда вы импортируете scipy.)

person David Z    schedule 01.01.2012
comment
Я не знал, что подмодули не импортируются автоматически. Спасибо! - person Aufwind; 02.01.2012
comment
На самом деле от пакета зависит, будут ли подмодули импортированы автоматически. - person Ethan Furman; 02.01.2012
comment
@Ethan: правда, я отредактировал примечание по этому поводу в ответ. - person David Z; 02.01.2012
comment
Думаю, стоит отметить, что основной причиной этого является наличие файловых систем без учета регистра (например, Windows). В такой системе может быть трудно понять, следует ли импортировать файл sparse.py как модуль с именем sparse, Sparse, или даже SParse или sParse (возможно, если это имеет какое-то отношение к синтаксическому анализу S-выражений). Python выбирает гарантию согласованного поведения в файловых системах с учетом и нечувствительности к регистру, требуя явного импорта для указания правильного имени (либо в вашей программе, либо в пакете __init__.py). - person Ben; 02.01.2012
comment
@ Бен, я чувствую, что ты лучший ответ на этот вопрос. - person tumultous_rooster; 15.04.2014

Потому что вы импортировали скучные, а не редкие. Попробовать from scipy import sparse?

person Dan    schedule 01.01.2012
comment
когда это изменилось? раньше был в состоянии4 на sp.sparse - person BirdLaw; 26.06.2019

AttributeError возникает, когда атрибут объекта недоступен.

ссылка на атрибут - это первичный атрибут, за которым следует точка и имя. :

attributeref :: = primary "." идентификатор

Чтобы вернуть список допустимых атрибутов для этого объекта, используйте dir(), например :

dir(scipy)

Так что, вероятно, вам нужно сделать просто: import scipy.sparse

person kenorb    schedule 23.05.2015

Пространство имен по умолчанию в Python - "__main__". Когда вы используете import scipy, Python создает отдельное пространство имен в качестве имени вашего модуля. Правило в Pyhton: когда вы хотите вызвать атрибут из другого пространства имен, вы должны использовать полное имя атрибута.

person Anirudh    schedule 19.08.2017