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

Linda Hamilton
Libérer: 2024-11-06 20:26:02
original
917 Les gens l'ont consulté

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
Copier après la connexion

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))
Copier après la connexion

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
Copier après la connexion

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

# a.py
from package import common

# b.py
from package import common
Copier après la connexion

É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))
Copier après la connexion

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!