Comment puis-je écrire un bon/bon package __init__.py fichiers
Mon colis a la structure suivante:
mobilescouter/
__init__.py #1
mapper/
__init__.py #2
lxml/
__init__.py #3
vehiclemapper.py
vehiclefeaturemapper.py
vehiclefeaturesetmapper.py
...
basemapper.py
vehicle/
__init__.py #4
vehicle.py
vehiclefeature.py
vehiclefeaturemapper.py
...
Je ne suis pas sûr de savoir comment les __init__.py
fichiers doit être écrit correctement.
Le __init__.py #1
ressemble:
__all__ = ['mapper', 'vehicle']
import mapper
import vehicle
Mais comment par exemple __init__.py #2
ressembler? Le mien est:
__all__ = ['basemapper', 'lxml']
from basemaper import *
import lxml
Quand doit-être __all__
utilisé?
- Sachez cependant que l'utilisation d'importation * dans le code est généralement très mauvaise pratique et doit être évitée si possible. Il y a très peu de bonnes cas d'utilisation pour le présent, mais ils sont très rares.
- PSA: si vous êtes intéressé à apprendre comment écrire un bon paquets d'espace de nom (le nouveau type de paquet), voyez l'exemple de paquet: github.com/pypa/sample-namespace-packages
Vous devez vous connecter pour publier un commentaire.
__all__
est très bonne, elle permet de guider les instructions d'importation sans import automatique des moduleshttp://docs.python.org/tutorial/modules.html#importing-from-a-package
à l'aide de
__all__
etimport *
est redondant, seulement__all__
est nécessaireJe pense que l'une des raisons les plus importantes pour utiliser
import *
dans un__init__.py
pour importer des paquets est d'être capable de refactoriser un script qui a grandi dans plusieurs scripts sans casser une application existante. Mais si vous êtes à la conception d'un package à partir du début. Je pense qu'il est préférable de laisser__init__.py
fichiers vides.par exemple:
puis l'application se développe et il est maintenant un dossier complet,
ensuite le script d'initialisation peut dire
de sorte qu'un script écrit pour faire ce qui suit ne pas les casser pendant le changement:
__all__
etimport *
est redondant",__all__
est utilisé par le consommateur du module, etfrom foo import *
est utilisé par le module lui-même en utiliser d'autres....Mon propre
__init__.py
fichiers sont vides le plus souvent. En particulier, je n'ai jamais defrom blah import *
dans le cadre de__init__.py
-- si "l'importation du package" signifie obtenir toutes sortes de classes, fonctions, etc directement défini dans le cadre du paquet, alors je lexicalement copier le contenu deblah.py
dans le paquet de__init__.py
au lieu et supprimerblah.py
(la multiplication des fichiers source n'est pas bonne ici).Si vous n'insistez sur le soutien de la
import *
idiomes (eek), puis à l'aide__all__
(avec minuscule d'une liste de noms que vous pouvez apporter vous-même à avoir en elle) peut aider pour le contrôle des dommages. En général, les espaces de noms et explicite les importations sont bonne choses, et j'ai de solides suggèrent d'envisager toute approche basée sur l'systématiquement en contournant un ou l'autre ou les deux concepts!-)import *
vous devez l'accepter sans réserve toutes le cadre dans son ensemble, même doté de la vous n'utiliserez jamais. en gardant__init__.py
vide vous donner plus de chances que simplement tout-ou-rien sémantique. pensez tordu.from mobilescouter import A, B
est juste une ligne de code et que vous n'avez pas de projet avec 666 classes et chacun avec son propre fichier, non? si vous avez deux ou plus de deuximport *
dans votre code vous de les remplir de l'espace de noms avec un potentiel d'ordures et rapidement, vous allez oublier oùA
viennent. Et si un upper package de faire de même? vous prenez tous les sous-packages et sous-sous-sous-packages. comme le zen de python dit, explicite est mieux qu'implicites.Votre
__init__.py
devrait avoir un docstring.Bien que toutes les fonctionnalités sont mises en œuvre dans les modules et les sous-paquets, le paquet docstring est l'endroit du document où commencer. Par exemple, considérons le python
email
le paquet. La documentation du paquet est une introduction décrivant le but, le contexte, et comment les différents composants dans le package de travailler ensemble. Si vous générer automatiquement la documentation de docstrings à l'aide de sphinx ou un autre paquet, le paquet docstring est exactement le bon endroit pour décrire une telle introduction.Pour tout autre contenu, voir les excellentes réponses par firecrow et Alex Martelli.