Importation correcte des modules en Python
Comment puis-je configurer le module importations, de sorte que chaque module peut accéder aux objets de tous les autres?
J'ai une taille moyenne de l'application en Python avec des modules de fichiers dans différents sous-répertoires. J'ai créé des modules que l'ajout de ces sous-répertoires à sys.path
et les importations d'un groupe de modules, à l'aide de import thisModule as tm
. Module d'objets sont désignés à l'aide de cette qualification. J'ai ensuite importer ce module dans les autres avec from moduleImports import *
. Le code est bâclée droit maintenant et a plusieurs de ces choses, qui sont souvent redondantes.
Tout d'abord, l'application est un échec parce que certains module de références ne sont pas affectés. Ce même code est exécuté lorsque l'appareil testé.
Deuxième, je suis inquiet que je suis à l'origine un problème avec récursive module importations. L'importation de moduleImports importations thisModule, qui importe moduleImports . . . .
Quelle est la bonne façon de le faire?
source d'informationauteur chernevik
Vous devez vous connecter pour publier un commentaire.
"J'ai une taille moyenne de l'application en Python avec des modules de fichiers dans différents sous-répertoires."
Bon. Assurez-vous que chaque répertoire comprennent un
__init__.py
fichier, de sorte que c'est un package."J'ai créé des modules que l'ajout de ces sous-répertoires à
sys.path
"Mauvais. Utilisation
PYTHONPATH
ou d'installer l'ensemble de la structureLib/site-packages
. Ne pas mettre à joursys.path
de façon dynamique. C'est une mauvaise chose. Dur à gérer et à maintenir."les importations d'un groupe de modules, à l'aide de
import thisModule as tm
."Ne fait pas de sens. Peut-être que vous avez un
import thisModule as tm
pour chaque module dans votre structure. Ceci est typique, la pratique standard: importer que les modules dont vous avez besoin, pas d'autres."J'ai ensuite importer ce module dans les autres avec
from moduleImports import *
"Mauvais. N'avez pas de couverture d'importer une collection de trucs.
Chaque module doit avoir une longuets liste des choses dont il a besoin.
Liste explicite. Pas de magie. Pas de changement dynamique de
sys.path
.Mon projet actuel est de 100 de modules, plus d'une dizaine de paquets. Pour chaque module, les importations juste ce dont il a besoin. Pas de magie.
Quelques conseils
Vous avez déjà split
la fonctionnalité dans les différents modules. Si
fait correctement, la plupart du temps, vous
ne tomberont pas dans la circulaire d'importation
problèmes (par exemple, si le module a dépend
sur b et de b sur a, vous pouvez faire une troisième
module c pour supprimer une telle circulaire
de la dépendance). En dernier ressort, dans un
importer b mais b importer un à l'
point où a est nécessaire par exemple à l'intérieur de
fonction.
Une fois que la fonctionnalité est bien
les modules de groupe dans des packs en vertu de
un sous répertoire et ajouter un
__init__.py
fichierà de sorte que vous pouvez importer les
package. Garder ces pakages dans un
dossier lib par exemple, puis ajouter
pour sys.chemin d'accès ou un ensemble PYTHONPATH env
variable
de module import * peut ne pas
être une bonne idée. Au lieu de cela, quelle que soit l'importation
est nécessaire. Il peut être pleinement qualifié. Il
ne fait pas de mal à être commentée. par exemple
de pakageA.moduleB importation
CoolClass.
La façon de le faire est d'éviter de magie. En d'autres termes, si votre module exige quelque chose à partir d'un autre module, il faut importer explicitement. Vous ne devriez pas compter sur les choses importées automatiquement.
Comme le Zen de Python (
import this
), explicite est mieux qu'implicites.Vous n'obtiendrez pas la récursivité sur les importations parce que Python caches de chaque module et de ne pas recharger une il a déjà.