55 votes

en utilisant __init__.py

Je ne comprends pas les scénarios d'utilisation ou les objectifs de conception de python. __init__.py dans mes projets.

Supposons que j'ai un répertoire 'modèle' (référencé comme un paquet) dans lequel j'ai conservé 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. Je dispose d'une définition commune qui doit être utilisée dans solrmodel.py , mongomodel.py , samodel.py . Dans ce cas, puis-je utiliser __init__.py comme une définition de base/commune pour toutes les classes *model.py ? Cela signifie que je dois importer model/__init__.py .

  2. Ou, le __init__.py a importé les définitions de solrmodel.py, mongomodel.py, samodel.py dans son propre système et permet d'importer facilement des classes ou des 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 juste utilisé comme une convention)

Je n'arrivais pas à me décider entre les deux scénarios ci-dessus. Existe-t-il d'autres scénarios d'utilisation pour __init__.py et pouvez-vous en expliquer l'usage ?

Documentation Python dit l'initialisation des paquets, mais je n'ai pas pu comprendre ce qu'il y a dans un paquet à initialiser.

42voto

Alex Martelli Points 330805

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

Un exemple dans lequel je peux avoir besoin d'une initialisation est lorsque, au moment du chargement du paquet, je veux lire un ensemble de données une fois pour toutes (à partir de fichiers, d'une base de données ou du web, par exemple) -- dans ce cas, c'est beaucoup plus agréable de mettre cette lecture dans une fonction privée dans le paquet __init__.py 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 paquetage (inutilement répétitif et source d'erreurs : il s'agit manifestement d'un cas où le fait de s'appuyer sur la garantie du langage que le module d'initialisation du paquetage __init__.py est chargé une fois avant tout module du paquetage est évidemment beaucoup plus pythonique !)

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

21voto

Le contenu de __init__.py sont importés lorsque vous importez un module au sein du paquet.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X