Maison >développement back-end >Tutoriel Python >Comment gérer les importations circulaires en Python avec des classes immuables et mutables ?

Comment gérer les importations circulaires en Python avec des classes immuables et mutables ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-06 20:26:021003parcourir

How to Handle Circular Imports in Python with Immutable and Mutable Classes?

Éviter les importations circulaires en Python avec des classes immuables et mutables

Les importations circulaires sont généralement considérées comme un symptôme d'une mauvaise conception de code. Cependant, dans certains scénarios, des dépendances circulaires entre classes peuvent être nécessaires. Pour éviter les erreurs d'importation dans de tels cas, il faut gérer soigneusement les instructions d'importation et le placement des références circulaires.

Exemple de scénario

Considérons deux classes, A et B, où A a un attribut mutable (une liste) et B un attribut immuable (un tuple). Chaque classe a besoin d'une méthode qui prend une instance de l'autre classe et renvoie une instance d'elle-même, transformant les attributs en conséquence.

Solutions

Il existe plusieurs approches à éviter importations circulaires dans ce scénario :

Importations absolues :

Dans a.py et b.py, utilisez des importations absolues pour garantir que les modules peuvent s'importer directement :

# a.py
from package import b

# b.py
from package import a

Différer l'importation :

Différer l'importation de l'autre classe jusqu'à ce qu'elle soit réellement nécessaire dans une fonction :

# a.py
def convert_to_list(b_obj):
    from package import b
    return a.A(list(b_obj.immutable_attr))

# b.py
def convert_to_tuple(a_obj):
    from package import a
    return b.B(tuple(a_obj.mutable_attr))

Intermédiaire Module :

Créez un module intermédiaire qui importe à la fois a et b. Ce module peut ensuite être importé à la fois par a et b pour éviter les importations circulaires :

# package/common.py
import a
import b

Dans a.py et b.py, importez le module intermédiaire :

# a.py
from package import common

# b.py
from package import common

Éviter les références circulaires dans les définitions de classe :

Les références circulaires dans les définitions de classe doivent être évitées. Envisagez plutôt de créer une fonction d'usine qui prend les attributs de la classe comme arguments et renvoie une instance de la classe appropriée :

# a.py
def create_a(list_attr):
    return A(list(list_attr))

# b.py
def create_b(tuple_attr):
    return B(tuple(tuple_attr))

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