объединение python-igraph с текущей проблемой графика

#python #igraph

#python #igraph

Вопрос:

У меня есть подкласс graph. Моя попытка состоит в том, чтобы добавить подзаголовок (также экземпляр igraph.Graph ) в качестве объединения

 import igraph

class Graph(igraph.Graph):

    def __init__(self, param_1, param_2):
        self.param_1 = param_1
        self.param_2 = param_2
        super(Graph, self).__init__()

    def append_subgraph(self, subgraph):
        self = igraph.union([self, subgraph])

def execute():
    graph = Graph(None, None)
    graph2 = Graph(None, None)
    graph.append_subgraph(graph2)
    print(graph)

if __name__ == '__main__':
    execute()
 

Когда я выполняю этот метод для экземпляра этого класса, я получаю сообщение об ошибке

 File "/usr/local/lib/python3.9/site-packages/igraph/operators.py", line 180, in union
    res = _union(newgraphs, edgemaps)
TypeError: __init__() got an unexpected keyword argument '__ptr'
 

Хотя эта проблема неприменима, когда я объединяю 2 отдельных графика без ссылки на self .

Кто-нибудь сталкивался с этой проблемой раньше?

Ответ №1:

Я создам минимальный пример для воспроизведения этой проблемы, а затем покажу вам, как ее исправить, но сначала давайте проверим, нет ли ошибок при объединении графов (все будет сделано в ipython для моего удобства):

 In [36]: import igraph as ig
...: ig.union((ig.Graph(), ig.Graph()))
Out[36]: <igraph.Graph at 0x24343faab80>
 

Хорошо, мы знаем, что объединение работает, давайте попробуем минимальное наследование:

 In [37]: class Graph(ig.Graph):
    ...:     ...
    ...: ig.union((Graph(), Graph()))
Out[37]: <__main__.Graph at 0x24343faac70>
 

Пока все хорошо. Давайте попробуем добавить наш новый __init__ :

 In [38]: class Graph(ig.Graph):
    ...:     def __init__(self, p, q):
    ...:         self.p = p
    ...:         self.q = q
    ...:         super().__init__()
    ...: ig.union((Graph(1, 2), Graph(1, 2)))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-38-68cf6a0e1e15> in <module>
      4         self.q = q
      5         super().__init__()
----> 6 ig.union((Graph(1, 2), Graph(1, 2)))

c:python38libsite-packagesigraphoperators.py in union(graphs, byname)
    178     # If any graph has any edge attributes, we need edgemaps
    179     edgemaps = any(len(g.edge_attributes()) for g in graphs)
--> 180     res = _union(newgraphs, edgemaps)
    181     if edgemaps:
    182         graph_union = res["graph"]

TypeError: __init__() got an unexpected keyword argument '__ptr'
 

Это наша ошибка. ожидается, что igraph Graph примет те же аргументы и аргументы ключевого ig.Graph слова, что и . Вот как мы можем это исправить:

 In [39]: class Graph(ig.Graph):
    ...:     def __init__(self, *args, p=None, q=None, **kwargs):
    ...:         self.p = p
    ...:         self.q = q
    ...:         super().__init__(*args, **kwargs)
    ...: ig.union((Graph(p=1, q=2), Graph(p=1, q=2)))
Out[39]: <__main__.Graph at 0x24343faa400>
 

Мы изменили сигнатуру our __init__ , чтобы принимать произвольные позиционные аргументы, наши конкретные параметры в качестве аргументов ключевого слова, затем произвольные аргументы ключевого слова. Теперь igraph может передавать те же аргументы, которые он передал ig.Graph s. Надеюсь, это поможет!

Комментарии:

1. Это потрясающий ответ! Большое вам спасибо!