Pourquoi est-ce AttributeError en python se produire?
Il y a une chose que je ne comprends pas.
Pourquoi cette
import scipy # happens with several other modules, too. I took scipy as an example now...
matrix = scipy.sparse.coo_matrix(some_params)
produire cette erreur:
AttributeError: 'module' object has no attribute 'sparse'
- Ce qui est gênant à ce sujet? De quoi vous attendre si
sparse
n'existe pas dans le module? - Je ne savais pas, que clairsemée est un sous-module de scipy, et que les submodules sont pas est automatiquement importée - comme @David Zaslavsky souligné ci-dessous.
- downvoters devront expliquer pourquoi ils downvoted, je ne vois pas quel est le problème avec cette question. En fait, je pense que c'est une très bonne question
- Merci @julio.alegria, il est bon d'entendre que, d'une autre personne. 🙂
Vous devez vous connecter pour publier un commentaire.
Cela se produit parce que le
scipy
module n'ont pas d'attribut nommésparse
. Cet attribut n'obtient que définie lorsque vousimport scipy.sparse
.Submodules n'est pas automatiquement importés lorsque vous venez de
import scipy
; vous devez les importer explicitement. La même chose vaut pour la plupart des paquets, bien qu'un paquet peut choisir d'importer ses propres submodules si elle veut. (Par exemple, siscipy/__init__.py
inclus une déclarationimport scipy.sparse
, puis lasparse
sous-module importés chaque fois que vous importezscipy
.)sparse
, ouSparse
, ou mêmeSParse
ousParse
(si il avait quelque chose à faire avec l'analyse des S-expressions, peut-être). Python choisit de garantir la cohérence des comportements sensibles à la casse et à la casse des systèmes de fichiers en exigeant un emprunt explicite pour lui indiquer le bon nom (que ce soit dans votre programme ou dans le package__init__.py
).Parce que vous avez importé scipy, non fragmenté. Essayez
from scipy import sparse
?AttributeError est déclenchée lors de l'attribut de l'objet n'est pas disponible.
Un attribut de référence est l'un des principaux suivie par une période et un nom:
Pour retourner une liste d'attributs valides pour cet objet, utilisez
dir()
, par exemple:Donc, vous avez probablement besoin de faire tout simplement:
import scipy.sparse
L'espace de noms par défaut de Python est
"__main__"
. Lorsque vous utilisezimport scipy
, Python crée un autre espace de votre nom de module.La règle en Pyhton est: lorsque vous souhaitez appeler un attribut de l'autre les espaces de noms, vous devez utiliser pleinement qualifié, le nom de l'attribut.