2017-02-22 15 views
0

Я хочу создать классы для следующей структуры графа:Как определить структуру рекурсивного графа в Python без циклического импорта?

  • график представляет собой список graph_nodes
  • graph_node объект с собственности graph_data в
  • graph_data является объектом с значение «value» , которое может быть либо примитивным, либо графиком.

Это вызывает циклический импорт, так как объект graph_data должен импортировать объект графика. Есть ли лучший способ структурировать эту структуру данных? Очевидно, это очень орошаемый пример, но я думаю, что это ключевая проблема с моим кодом.

Вот пример кругового импорта:

#file main.py: 
from graph import graph 
myGraph = graph() 

#file graph.py 
import graph_node 
class graph: 
    graph_nodes = [] 

    def __init__(self, graph_nodes=None): 
     if graph_nodes == None: 
      self.graph_nodes = graph_nodes 
     else: 
      for i in range(5): 
       self.graph_nodes.append(graph_node.graph_node()) 

#file graph_node.py 
import graph_node_data 
class graph_node: 
    graph_data = None 

    def __init__(self): 
     self.graph_data = graph_node_data.graph_node_data() 

#file graph_node_data.py 
import graph 
class graph_node_data: 
    value = None 

    def __init__(self): 
     self.value = graph.graph(graph_nodes = None) 

Вот график, иллюстрирующий, где эта структура может быть полезной.

Example

+1

Почему вам нужно разделять 'graph_node' и' graph_node_data' на два класса/файлы? выглядит для меня чрезмерной инженерией. – alfasin

+0

Это не требуется, но приятно сохранить структуру графика в более сложном коде. Все еще есть проблема с круговой проблемой в любом случае – CamJohnson26

+0

В файле 'file graph.py' вы импортируете' graph_node', но вы его не используете;) – alfasin

ответ

1

Просто объединил код в одном файле, работает отлично:

class graph: 
    graph_nodes = [] 

    def __init__(self, graph_nodes=None): 
     if graph_nodes == None: 
      self.graph_nodes = graph_nodes 
     else: 
      for i in range(5): 
       self.graph_nodes.append(graph_node.graph_node()) 

class graph_node: 
    graph_data = None 

    def __init__(self): 
     self.graph_data = graph_node_data.graph_node_data() 

class graph_node_data: 
    value = None 

    def __init__(self): 
     self.value = graph.graph(graph_nodes = None) 

myGraph = graph() 

Если вам действительно нужно держать классы в отдельных файлах, вам необходимо использовать местный импорт, т.е. объявить оператор импорта в функциях, например

def fn(): 
    import graph 
+0

Помещение классов в один файл - хорошая идея, но не совсем реально, когда эти классы становятся большими. И использование инструкции import в функции кажется взломанной, возможно, есть лучший способ ее разработки. – CamJohnson26

Смежные вопросы