Dependencia circular en Python

Tengo dos archivos, node.py y path.py , que definen dos clases, Node y Path , respectivamente.

Hasta hoy, la definición de Path referencia al objeto Node , y por lo tanto había hecho

 from node.py import * 

en el archivo path.py

Sin embargo, a partir de hoy, creé un nuevo método para Node que hace referencia al objeto Path .

Tuve problemas al intentar importar path.py : lo intenté, y cuando el progtwig se ejecutó y llamó al método Path que usa Node , surgió una excepción acerca de que Node no estaba definido.

¿Qué debo hacer?

Importar módulos de Python es un gran artículo que explica las importaciones circulares en Python.

La forma más sencilla de solucionar este problema es mover la importación de la ruta al final del módulo de nodo.

Otro enfoque es importar uno de los dos módulos solo en la función donde lo necesita en el otro. Claro, esto funciona mejor si solo lo necesita en una o en una pequeña cantidad de funciones:

 # in node.py from path import Path class Node ... # in path.py class Path def method_needs_node(): from node import Node n = Node() ... 

Prefiero romper una dependencia circular declarando una de las dependencias en el constructor de la otra clase dependiente. En mi opinión, esto mantiene el código más limpio y brinda fácil acceso a todos los métodos que requieren la dependencia.

Entonces, en mi caso, tengo un CustomerService y un UserService que dependen unos de otros. Rompo la dependencia circular de la siguiente manera:

 class UserService: def __init__(self): # Declared in constructor to avoid circular dependency from server.portal.services.admin.customer_service import CustomerService self.customer_service = CustomerService() def create_user(self, customer_id: int) -> User: # Now easy to access the dependency from any method customer = self.customer_service.get_by_id(customer_id)