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
Barbara Streisandoriginal
2024-12-27 21:05:10635parcourir

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

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__)
  • 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__)
  • 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__)
  • 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
  • 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__)

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!

Déclaration:
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