É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!