Importe toutes les classes (ou fonctions) dans tous les fichiers du dossier, comme s'ils étaient tous dans le fichier __init__
J'ai un dossier avec plusieurs fichiers contenant beaucoup de classes différentes. Tous ces éléments peuvent être dans un seul gros fichier, mais pour le plaisir de faire un peu plus facile à lire que j'ai divisé en plusieurs fichiers selon les classes appartient.
J'aimerais importer toutes les classes de tous les fichiers dans le dossier dans la __init__
fichier afin que je puisse importer quoi que ce soit à partir du dossier sans le savoir dans quel fichier il appartient.
Exemple:
/kitchen
+ __init__.py
+ fridge.py
+ stove.py
+ cupboard.py
Maintenant, je dois
from kitchen.fridge import milk
Quand je voudrais faire
from kitchen import milk
L'équivalent de ce que je peux le faire en __init__.py
faire:
from kitchen.fridge import *
from kitchen.stove import *
from kitchen.cupboard import *
Et puis je peux faire
from kitchen import milk
Mais j'aimerais qu'il prenne tous les fichiers dans le dossier, sans avoir à le spécifier explicitement (afin que les fichiers peuvent être sous-évaluées et puis il y en a utilisé).
Est-il possible de faire cela?
source d'informationauteur olofom
Vous devez vous connecter pour publier un commentaire.
C'est une très mauvaise idée. Si vous souhaitez ajouter un mécanisme pour les fichiers en "sous-évaluées et", vous voulez probablement trouver un plugin régime, et de rechercher le répertoire du plugin(s).
La façon dont vous le faites normalement c'est pour itérer un ou plusieurs plugin répertoires avec
os.listdir
ouos.walk
puis, pour chaque fichier Python, utilisezimportlib
(de niveau inférieur ou équivalents deimp
en Python 2.x) pour l'importer par le chemin.Toutefois, si vous avez vraiment insister sur truquer les choses de cette façon à l'intérieur d'un paquet, vous pouvez faire fondamentalement les mêmes trucs dans le
__init__.py
fichier, à l'aide deos.path.dirname(__file__)
que le répertoire du plugin.Et, si vraiment vous insistez sur le fait de faire l'équivalent de
from foo import *
au lieu deimport foo
en chemin, c'est tout aussi facile—ou, alternativement, vous pouvez utiliserexecfile
.Si vous ne savez pas comment faire ces choses simples, ou comment chercher dans les docs... alors vous avez certainement ne devriez pas tenter cette. Donc, je ne fournis pas de code d'exemple dans ce cas.
Explicite est mieux qu'implicites. Ne pas le faire. Vous pouvez certainement hack quelque chose ensemble qui ne automatique des importations à un certain degré. Mais c'est vraiment pas la peine. C'est juste une ligne pour chaque fichier ajouté dans la
__init__.py
et vous avez terminé. Les solutions simples sont mieux, sauf si vous obtenez beaucoup de le plus compliqué, ce qui n'est certainement pas le cas ici.Non, il ne l'est pas. Et en plus de cela, vous ne devriez pas
import *
mais dans le__init__.py
importer explicitement. Cette façon de diviser les modules communs et de bonnes pratiques, par la manière.import *
est acceptable si vous pouvez également définir un__all__
attribut dans chaque module, mais il n'y a pas de réel avantage à le faire, et il a tendance à casser des analyseurs de code.