ma question concerne l'écriture de paquets Python (3.x) et de (sous-) modules ainsi que l'utilisation correcte des fichiers __init__.py
pour déclarer les espaces de noms.
J'avais l'habitude de coder en C++, donc j'aime utiliser beaucoup de fichiers séparés pour organiser des projets. Par exemple, (imo) si un module contient plusieurs classes, chacune d'elles doit être dans un fichier séparé.Comment utiliser __init__.py dans des (sous-) modules pour définir des espaces de noms?
Comme je suis inexpérimenté en développement en Python, il est difficile de formuler mes pensées dans une question simple. Considérons le petit paquet python suivant à titre d'exemple.
Répertoire layout
dir
|
+-- example
| |
| +-- script.py
|
+-- package
|
+-- __init__.py
|
+-- foo.py
|
+-- subpackage
|
+-- __init__.py
|
+-- bar.py
Jetons un regard sur les fichiers.
Contenu du fichier
package/foo.py
:
def foo:
print('foo')
package/subpackage/bar.py
:
def bar:
print('bar')
Le example/script.py
suivant fonctionne très bien.
import sys
sys.path.insert(0, '..')
import package
import package.subpackage
package.foo.foo()
package.subpackage.bar.bar()
Je n'aime pas utiliser package.foo.foo()
/package.subpackage.bar.bar()
et je voudrais utiliser package.foo()
/package.subpackage.bar()
.
Et je ne veux pas utiliser from package.subpackage.bar import bar
, car je ne veux pas mélanger l'espace de noms de sous-paquetage dans le script.
Solution
J'ai utilisé les fichiers __init__.py
pour y parvenir.
package/__init__.py
:
from package.foo import foo
package/subpackage/__init__.py
:
from package.subpackage.bar import bar
Questions
Est-ce une bonne façon comme python pour définir les espaces de noms? Ou y a-t-il une meilleure/commune façon d'organiser le système de fichiers d'un paquet en python. (Je n'ai pas trouvé un tutoriel/bon exemple pour cela.)
Dans le fichier
package/subpackage/__init__.py
, pourquoi doit-il être:from package.subpackage.bar import bar
et non:
?
Cela se traduirait par l'erreur:
Traceback (most recent call last):
File "script.py", line x, in <module>
import package.subpackage
File "..\package\subpackage\__init__.py", line x, in <module>
from subpackage.bar import bar
ImportError: No module named 'subpackage'
Merci pour ta réponse. Fondamentalement, votre deuxième lien ("La façon Pythonic ...") est la question StackOverflow que je cherchais. Je n'aime pas l'idée de "jeter une tonne de code" dans un seul fichier comme le dit l'auteur. Mais comme Python considère les fichiers comme des modules, il semble qu'il n'y ait pas de bonne solution. J'ai eu l'idée d'éditer les fichiers '__init __. Py' [ici] (https://www.blog.pythonlibrary.org/2012/07/08/python-201-creating-modules-and-packages/) . –