11
votes

Python: Importations circulaires nécessaires à la vérification de type

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> xxx pré>

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()


1 commentaires

Voir Stackoverflow.com/questions/39740632/... pour la bonne réponse.


4 Réponses :


6
votes

La meilleure solution consiste à ne pas vérifier les types.

L'autre solution consiste à ne pas créer d'instance de, et non de référence du tout, FOO ou bar jusqu'à ce que les deux classes soient chargées. Si le premier module est chargé en premier, ne créez pas de barre ou reportez-vous à la barre jusqu'à une fois la déclaration de la classe est exécutée. De même, si le deuxième module est chargé en premier, ne créez pas de foo ou référence foo jusqu'à une fois la barre de classe est exécutée. < / p>

Ceci est fondamentalement la source du importerror , qui pourrait être évitée si vous avez fait "importer foo" et "barre d'importation" et "code d'importation" et utilisé foo.foo où Vous utilisez maintenant FOO et bar.bar où vous utilisez maintenant bar . Ce faisant, vous ne vous référez plus à l'une quelconque d'un FOO ou bar est créé, ce qui n'aura plus d'aborder qu'après la création (sinon vous " ll obtenir un attributeError ).


0 commentaires

2
votes

Vous pouvez simplement différer l'importation dans bar.py comme ceci: xxx


4 commentaires

Toutes les importations devraient aller au sommet, sauf s'il y a une raison vraiment 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.




2
votes

duplicaté possible: ASIME DE TYPE PYTHON SANS Importations cycliques

Vous devez utiliser Référence directe ( Pep 484 - Type de signalisation):

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.

donc au lieu de: xxx

faire: xxx


0 commentaires