Maison > développement back-end > Tutoriel Python > Comment les importations circulaires en Python peuvent-elles être évitées et résolues ?

Comment les importations circulaires en Python peuvent-elles être évitées et résolues ?

Barbara Streisand
Libérer: 2024-12-27 21:05:10
original
566 Les gens l'ont consulté

How Can Circular Imports in Python Be Avoided and Resolved?

Importations circulaires en Python : pièges et solutions

Dans le domaine de la programmation Python, des dépendances circulaires peuvent survenir lorsque des modules tentent de s'importer les uns les autres. Comprendre le comportement de telles importations est crucial pour éviter les pièges potentiels.

Lorsque deux modules, disons foo et bar, s'importent mutuellement à l'aide de import foo et import bar, les importations réussiront de manière transparente car les deux modules sont entièrement chargés. et peuvent se référencer les uns les autres.

Cependant, des problèmes surviennent lors de l'utilisation de from importations, comme from foo import abc et from bar import xyz. Dans ces scénarios, chaque module nécessite que l’autre soit importé avant de pouvoir continuer. Cette dépendance cyclique entraîne une erreur d'importation.

Pour illustrer, considérons le code suivant :

# foo.py
from bar import xyz

def abc():
    print(xyz.__name__)

# bar.py
from foo import abc

def xyz():
    print(abc.__name__)
Copier après la connexion

Ce code déclenchera une ImportError car foo nécessite que bar soit importé avant de pouvoir exécuter le from import, mais bar nécessite également que foo soit importé en premier.

Pour gérer efficacement les importations circulaires, plusieurs solutions exister :

  • Haut du module ; non de ; Python 2 uniquement :

    # foo.py
    import bar
    
    def abc():
      print(bar.xyz.__name__)
    
    # bar.py
    import foo
    
    def xyz():
      print(foo.abc.__name__)
    Copier après la connexion
  • Haut du module ; de ok ; relatif ok ; Python 3 uniquement :

    # foo.py
    from . import bar
    
    def abc():
      print(bar.xyz.__name__)
    
    # bar.py
    from . import foo
    
    def xyz():
      print(abc.__name__)
    Copier après la connexion
  • Haut du module ; non de ; aucun parent :

    # foo.py
    import lib.bar
    
    def abc():
      print(lib.bar.xyz.__name__)
    
    # bar.py
    import lib.foo
    
    def xyz():
      print(lib.foo.abc.__name__)
    Copier après la connexion
  • Bas du module ; attribut d'importation, pas de module ; de ok :

    # foo.py
    def abc():
      print(xyz.__name__)
    
    from .bar import xyz
    
    # bar.py
    def xyz():
      print(abc.__name__)
    
    from .foo import abc
    Copier après la connexion
  • Haut de fonction ; de d'accord :

    # foo.py
    def abc():
      from . import bar
      print(bar.xyz.__name__)
    
    # bar.py
    def xyz():
      from . import foo
      print(foo.abc.__name__)
    Copier après la connexion

Les importations d'étoiles, cependant, ne sont pas abordées dans les exemples fournis dans l'article original.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal