Tout d'abord: je sais qu'il existe déjà de nombreuses questions et réponses au sujet des importations circulaires.
La réponse est plus ou moins: "Concevez votre module / structure de classe correctement et vous n'aurez pas besoin d'importations circulaires". C'est vrai. J'ai essayé très fort de faire un design approprié pour mon projet actuel, je suis à mon avis, j'avais réussi avec cela. P>
Mais mon problème spécifique est le suivant: j'ai besoin d'un chèque de type dans un module qui est déjà importé par le module contenant la classe pour vérifier. Mais cela jette une erreur d'importation. P>
Comme: p>
foo.py: p> bar.py: p > from foo import Foo
class Bar(object):
def __init__(self, arg_instance_of_foo):
if not arg_instance_of_foo.__class__.__name__ == "Foo":
raise TypeError()
4 Réponses :
La meilleure solution consiste à ne pas vérifier les types. p>
L'autre solution consiste à ne pas créer d'instance de, et non de référence du tout, Ceci est fondamentalement la source du FOO code> ou
bar code> jusqu'à ce que les deux classes soient chargées. Si le premier module est chargé en premier, ne créez pas de barre code> ou reportez-vous à la barre code> jusqu'à une fois la déclaration code> de la classe code> est exécutée. De même, si le deuxième module est chargé en premier, ne créez pas de
foo code> ou référence
foo code> jusqu'à une fois la barre de classe code> code> est exécutée. < / p>
importerror code>, qui pourrait être évitée si vous avez fait "importer foo" et "barre d'importation" et "code d'importation" et utilisé
foo.foo code> où Vous utilisez maintenant
FOO code> et
bar.bar code> où vous utilisez maintenant
bar code>. Ce faisant, vous ne vous référez plus à l'une quelconque d'un
FOO code> ou
bar code> est créé, ce qui n'aura plus d'aborder qu'après la création (sinon vous " ll obtenir un
attributeError code>). p>
Vous pouvez simplement différer l'importation dans bar.py comme ceci:
Toutes les importations devraient aller au sommet, sauf s'il y a une raison vraiment i> de bonne raison de ne pas le faire. Ce n'est pas ça.
@Devin: Votre réponse est meilleure, mais c'est un moyen standard de manipuler des importations circulaires afin que la réponse soit toujours utile.
@Devin Jeanpierre: Que pouvais-je faire d'autre?
@FogleBird: Ce n'est pas un standard (ou idiome, etc.) que j'ai entendu parler.
>> :) assez juste. En Java et à d'autres langues dactylographiques fortes, ces problèmes apparaissent assez souvent et ont des solutions «standard». C'est "pas un problème" dans Python où le typing du canard est juste "le chemin". Néanmoins, j'ai supposé que, une fois la question posée, il existe une "exigence" pour assurer le type.
duplicaté possible: ASIME DE TYPE PYTHON SANS Importations cycliques A> Vous devez utiliser Référence directe ( Pep 484 - Type de signalisation): P> Lorsqu'un indice de type contient des noms qui n'ont pas encore été définis, cette définition peut être exprimée en tant que littéral à chaîne, à résoudre ultérieurement. P>
blockQuote> donc au lieu de: p> faire: p>
Voir Stackoverflow.com/questions/39740632/... pour la bonne réponse.