2009-05-21 26 views
48

Tengo dos archivos, node.py y path.py, que definen dos clases, Node y Path, respectivamente.Dependencia circular en Python

Hasta hoy, la definición de Path hace referencia el objeto Node, y por lo tanto me habían hecho

from node.py import * 

en el archivo path.py.

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

tuve problemas al intentar importar path.py: Lo probé, y cuando el programa se ha ejecutado y llama al método que utiliza PathNode, una excepción de rosa De cerca Node no se está definiendo.

¿Qué debo hacer?

+2

¿duplicado? http://stackoverflow.com/questions/744373/python-cyclic-imports –

+2

¿Está intentando tener una clase por archivo? Es por eso que rara vez funciona bien. –

+3

De acuerdo con S.Lott. Python no es Java. No necesitas una clase por archivo. –

Respuesta

84

Importing Python Modules es un excelente artículo que explica las importaciones circulares en Python.

La manera más fácil de solucionar esto es mover la importación de ruta al final del módulo de nodo.

+0

Está bien, pero la cosa es que tengo otros dos módulos 'tree.py' y' block.py' en ese paquete que requieren 'node.py' y son requeridos por' path.py'. Entonces, ¿se supone que debo ponerlos todos en un solo archivo? Me gustó tener un módulo por clase. –

+1

¿Has probado mi sugerencia? Probablemente funcione. Simplemente mueva la importación al final del archivo. Te aconsejo que leas el artículo para entender por qué sucede esto. –

+0

Tienes razón Nadia. Leí mal tu sugerencia al principio. Funcionó. –

13

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 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() 
    ... 
Cuestiones relacionadas