utilisation init.py

J'ai du mal à 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' (se réfère comme un paquet) 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 qui doit être utilisé dans solrmodel.py, mongomodel.py, samodel.py. Puis-je utiliser __init__.py comme une base / définition commune pour tous les *model.py cours? Cela signifie que je dois importer model/__init__.py.

  2. Ou, le {[1] } doit avoir des définitions importées de solrmodel.py, mongomodel.py, samodel.py dans son propre 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 j'ai simplement utilisé comme une convention)

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

61
demandé sur Gewthen 2010-03-02 08:36:24

2 réponses

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

Un exemple dans lequel je peux vouloir l'initialisation est quand au moment du chargement du paquet je veux lire un tas de données une fois pour toutes (à partir de fichiers, D'une base de données ou du web, par exemple) - auquel cas il est beaucoup plus agréable de mettre cette lecture dans une fonction privée dans __init__.py Du paquet chaque module réel du paquet (inutilement répétitif et sujet aux erreurs: c'est évidemment un cas dans lequel s'appuyer sur la garantie de la langue que le paquet est __init__.py est chargé une fois avant que n'importe quel module dans le paquet soit évidemment beaucoup plus pythonique!).

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

47
répondu Alex Martelli 2010-03-02 06:26:05

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

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

22
répondu Ignacio Vazquez-Abrams 2010-03-02 05:42:02