J'ai commencé à utiliser sckikit-learn pour mon travail. Je parcourais donc le tutoriel qui donne la procédure standard pour charger certains jeux de données:
$ python
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()
Cependant, pour ma commodité, j'ai essayé de charger les données de la manière suivante:
In [1]: import sklearn
In [2]: iris = sklearn.datasets.load_iris()
Cependant, cela génère l'erreur suivante:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-2-db77d2036db5> in <module>()
----> 1 iris = sklearn.datasets.load_iris()
AttributeError: 'module' object has no attribute 'datasets'
Cependant, si j'utilise la méthode apparemment similaire:
In [3]: from sklearn import datasets
In [4]: iris = datasets.load_iris()
Cela fonctionne sans problème. En fait, ce qui suit fonctionne également:
In [5]: iris = sklearn.datasets.load_iris()
Je suis complètement confus à ce sujet. Suis-je en train de manquer quelque chose de très trivial? Quelle est la différence entre les deux approches?
sklearn
est un package . Cette réponse l'a dit très succinctement:
lorsque vous importez un package, seules les variables/fonctions/classes du
__init__.py
Les fichiers de ce package sont directement visibles, pas les sous-packages ou modules.
datasets
est un sous-package de sklearn
. C'est pourquoi cela se produit:
In [1]: import sklearn
In [2]: sklearn.datasets
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-2-325a2bfc35d0> in <module>()
----> 1 sklearn.datasets
AttributeError: module 'sklearn' has no attribute 'datasets'
Cependant, la raison pour laquelle cela fonctionne:
In [3]: from sklearn import datasets
In [4]: sklearn.datasets
Out[4]: <module 'sklearn.datasets' from '/home/ethan/.virtualenvs/test3/lib/python3.5/site-packages/sklearn/datasets/__init__.py'>
est que lorsque vous chargez le sous-package datasets
en faisant from sklearn import datasets
il est automatiquement ajouté à l'espace de noms du package sklearn
. C'est l'un des moins connus "pièges" du système d'importation Python .
Notez également que si vous regardez le __init__.py
pour sklearn
vous verrez voir 'datasets'
en tant que membre de __all__
, mais cela ne vous permet que de faire:
In [1]: from sklearn import *
In [2]: datasets
Out[2]: <module 'sklearn.datasets' from '/home/ethan/.virtualenvs/test3/lib/python3.5/site-packages/sklearn/datasets/__init__.py'>
Un dernier point à noter est que si vous inspectez sklearn
ou datasets
, vous verrez que, bien qu'il s'agisse de packages, leur type est module
. En effet, tous les packages sont considérés comme des modules. Cependant, tous les modules ne sont pas des packages.