#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. Это потрясающий ответ! Большое вам спасибо!