2012-01-01 988 views
28

Hay una cosa que no entiendo.¿Por qué ocurre este AttributeError en python?

¿Por qué este

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

matrix = scipy.sparse.coo_matrix(some_params) 

genere el error:

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

¿Qué tiene de molesto eso? ¿Qué espera que suceda si 'sparse' no existe en el módulo? –

+1

No me di cuenta, que disperso es un * submódulo * de scipy, y que los submódulos *** no ** se importan automáticamente * - como lo señala @David Zaslavsky a continuación. – Aufwind

+11

downvoters deberían explicar por qué downvoters, no veo lo que está mal con esta pregunta. De hecho, creo que es una muy buena pregunta – juliomalegria

Respuesta

41

Esto sucede porque el módulo scipy no tiene ningún atributo llamado sparse. Ese atributo solo se define cuando import scipy.sparse.

Los submódulos no se importan automáticamente cuando acaba de import scipy; necesita importarlos explícitamente. Lo mismo se aplica a la mayoría de los paquetes, aunque un paquete puede elegir importar sus propios submódulos si así lo desea. (Por ejemplo, si scipy/__init__.py incluyó una declaración import scipy.sparse, a continuación, el submódulo sparse se importaría siempre que importar scipy.)

+1

No sabía, que los submódulos no se importan automáticamente. ¡Gracias! – Aufwind

+0

Depende realmente del paquete si los submódulos también se importan automáticamente. –

+0

@Ethan: cierto, edité una nota a ese efecto en la respuesta. –

3

Debido a que ha importado scipy, no escasa. Pruebe from scipy import sparse?

1

AttributeError se genera cuando el atributo del objeto no está disponible.

Un attribute reference es un primario seguido de un punto y un nombre:

attributeref ::= primary "." identifier

para devolver una lista de atributos válidos para ese objeto, utilice dir(), por ejemplo:

dir(scipy) 

Así que probablemente se debe hacer simplemente: import scipy.sparse

-1

El espacio de nombre predeterminado en Python es "__main__". Cuando usa import scipy, Python crea un espacio de nombre separado como nombre de su módulo. La regla en Pyhton es: cuando desea llamar a un atributo desde otros espacios de nombres, debe usar el nombre de atributo completamente calificado.

Cuestiones relacionadas