web-dev-qa-db-fra.com

en utilisant __init__.py

J'ai des difficultés à comprendre les scénarios d'utilisation ou les objectifs de conception des fichiers __init__.py De python dans mes projets.

Supposons que j'ai le répertoire "model" (fait référence à un package) qui contient les fichiers suivants

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py

J'ai trouvé deux façons d'utiliser __init__.py:

  1. J'ai une définition commune qui doit être utilisée dans solrmodel.py, mongomodel.py, samodel.py. Puis-je utiliser __init__.py Comme base/définition commune pour toutes les classes * model.py? Cela signifie que je dois importer model/__init__.py.

  2. Ou, le __init__.py Doit avoir des définitions importées de solrmodel.py, mongomodel.py, samodel.py en lui-même et il permet l'importation facile de classes ou de fonctions comme ceci:

    # file: __init__.py
    
    from mongomodel import *
    from solrmodel import *
    from samodel import *
    

    (Je suis conscient que import * N'est pas recommandé et je l'ai simplement utilisé comme convention)

Je ne pouvais pas décider entre deux scénarios ci-dessus. Y a-t-il plus de scénarios d'utilisation pour __init__.py Et pouvez-vous expliquer l'utilisation?

64
user90150

La grande majorité des fichiers __init__.py Que j'écris sont vides, car de nombreux packages n'ont rien à initialiser.

Un exemple dans lequel je voudrais peut-être l'initialisation est quand au moment du chargement du package je veux lire une fois pour toutes dans un tas de données (à partir de fichiers, d'une base de données ou du Web, par exemple) - auquel cas c'est beaucoup plus agréable de mettre cette lecture dans une fonction privée dans le __init__.py du package plutôt que d'avoir un "module d'initialisation" séparé et d'importer de manière redondante ce module à partir de chaque module réel du package (répétition et erreur inutiles -prone: c'est évidemment un cas dans lequel s'appuyer sur la garantie du langage que le __init__.py du package est chargé une fois avant n'importe quel module du package est évidemment beaucoup plus Pythonic!).

Pour d'autres expressions d'opinion concrètes et faisant autorité, regardez les différentes approches adoptées dans les différents packages qui font partie de la bibliothèque standard de Python.

49
Alex Martelli

Le contenu de __init__.py sont importés lorsque vous importez un module dans le package.

Vous ignorez un troisième scénario, qui consiste à placer les parties communes dans un module distinct, puis à importer les autres modules, laissant __init__.py pour les choses qui seront utilisées en dehors du paquet. C'est la pratique que je pratique habituellement.

23