Gérer les dépendances circulaires dans les modules Python?
c'est un cas où je suis à courir en rond et je suis sur le point d'aller sauvages.
Je souhaite Python permettrait d'analyser tous les fichiers à la première, afin qu'il puisse connaître tous les identifiants depuis le début (je pense comme Java).
J'ai un "main.py" et d'un "gui.py". Chaque fichier contient une classe, ce qui rend l'utilisation de la classe dans l'autre fichier. Lorsque j'essaie d'exécuter "main.py", l'interprète des importations "gui", puis dans "gui.py" il importe "principale", puis il traite de l'ensemble du module principal et dit: "Tee-hee, il n'y a pas de classe avec le nom donné dans gui.py."
Comment puis-je gérer les dépendances circulaires en Python avec un minimum de tracas?
OriginalL'auteur rynd | 2012-04-11
Vous devez vous connecter pour publier un commentaire.
Je pensais étendre vers une réponse au lieu d'un commentaire.
Il est intéressant de noter que circulaire importations sont généralement un signe de mauvaise conception: au lieu de demander la langue en fonction de votre design, pourquoi ne pas changer de design?
Il y a des façons de contourner ce problème en python:
import
états à un champ d'application différent.Mais non, vous ne pouvez pas pré-analyser les fichiers. Ce n'est pas la façon Python fonctionne, et si vous regardez la façon Python fonctionne, il est assez évident pourquoi.
Déplacement de l'importation à la fin du fichier ne fonctionne pas. Si elle se place n'importe où dans la portée de module, il sera le déclencheur d'une circulaire à l'importation. Déplacement de l'importer vers un autre champ d'application permettra de résoudre le problème (voir ma réponse ci-dessous)
Corrigé, et +1 pour ta réponse, pour donner plus de détails dans cette affaire.
Dans un ORM modèle de style où ObjectA a beaucoup de ObjectB et ObjectB appartient à ObjectA. C'est une commune de la dépendance cyclique qui semble faire sens total. Est-il un bon moyen de supprimer cette dépendance de la conception?
Option 2 - déplacer le conjoncturelle à l'importation quelque part où il n'est exécuté qu'après la première importation est terminée.
OriginalL'auteur Gareth Latty
Si vous ne pouvez pas éviter la circulaire importations, déplacez l'un des importations de module au niveau de la portée, et la méthode/fonction où il a été utilisé.
filea.py
fileb.py
De cette façon, filea ne importés lorsque vous appelez fileb_thing(), et puis il reimports fichierb, mais depuis fileb_thing n'est pas appelée à ce point, vous n'avez pas de garder une boucle autour.
Comme d'autres l'ont souligné, c'est une odeur de code, mais parfois vous avez besoin de faire quelque chose, même si c'est moche.
OriginalL'auteur jcdyer
En général, les dépendances devraient être un arbre. Les dépendances circulaires ne sont pas résolubles.
La manière habituelle pour résoudre ce problème, cependant, est de faire une "importation" du module obligatoire à un autre niveau que l'espace de noms global.
OriginalL'auteur bukzor