Il existe d'importantes idées fausses qu'il convient de corriger, notamment en ce qui concerne la terminologie. Tout d'abord, en général, lorsque vous pensez que vous importez une package
en python, ce que vous importez en réalité est un fichier module
. Vous devez utiliser le terme package
quand vous pensez en termes de sous-structure de système de fichiers qui vous aide à organiser votre code. Mais du point de vue du code, chaque fois que vous importez un fichier package
Python le traite comme un module. Tous les packages sont des modules. Tous les modules ne sont pas des packages. Un module avec l'extension __path__
est considéré comme un paquet.
Vous pouvez vérifier que os
est un module. Pour le confirmer, vous pouvez le faire :
import os
print(type(os)) # will print: <type 'module'>
Dans votre exemple, lorsque vous faites import FooPackage
, FooPackage
est traité et considéré comme un module également, et ses attributs (fonctions, classes, etc.) sont censés être définis dans le module __init__.py
. Puisque votre __init__.py
est vide, il ne peut pas trouver foo
.
En dehors de import
les déclarations que vous ne pouvez pas utiliser '.'
pour adresser les modules à l'intérieur des modules. La seule exception se produit si un module
est importé dans le paquet du parent prévu __init__.py
fichier. Pour que tout soit clair, prenons quelques exemples :
Considérez votre structure d'origine :
FooPackage/
__init__.py
foo.py
Cas 1 : __init__.py est un fichier vide
#FooPackage imported as a module
import FooPackage
#foo is not a name defined in `__init__.py`. Error
FooPackage.foo
#FooPackage.foo imported as a module
import FooPackage.foo
#Error, foo has not been imported. To be able to use foo like this,
#you need to do: import FooPackage.foo as foo
foo.anything
#Not error, if anything is defined inside foo.py
FooPackage.foo.anything
Cas 2 : __init__.py a la ligne import foo
en elle :
import FooPackage
#Now this is good. `foo` is sort of considered to be an attribute of
#FooPackage
FooPackage.foo
Maintenant, supposons que foo n'est plus un module
mais un function
que vous définissez dans __init__.py
. si vous le faites import FooPackage.foo
le message d'erreur suivant s'affichera foo
n'est pas un module.