Пользовательский объект класса как атрибут вершины в iGraph - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь создать граф с iGraph, вершины которого имеют некоторые атрибуты, как объект из класса, который я определил. Класс использует словарь для представления платы Connect-4 любого размера. Конструктор выглядит следующим образом:

class Tauler:

def __init__(self, num_files, num_columnes):
    self.files, self.columnes = num_files, num_columnes
    self.tauler = {i: [0] * num_columnes for i in range(num_files)}

Когда я пытаюсь назначить объект Tauler в качестве атрибута некоторой вершины, я получаю следующую ошибку:

g = igraph.Graph(n=1, directed=True, vertex_attrs={"tauler": t1})
Traceback (most recent call last):

  File "<ipython-input-10-9167be7715d9>", line 1, in <module>
    g = igraph.Graph(n=1, directed=True, vertex_attrs={"tauler": t1})

  File "C:\Users\Stohl\anaconda3\lib\site-packages\igraph\__init__.py", line 232, in __init__
    self.vs[key] = value

TypeError: object of type 'Tauler' has no len()

Если я тогда попытайтесь определить метод len следующим образом:

def __len__(self):
    return self.tauler

Я получаю следующую ошибку:

g = igraph.Graph(n=1, directed=True, vertex_attrs={"tauler": t1})
Traceback (most recent call last):

  File "<ipython-input-13-9167be7715d9>", line 1, in <module>
    g = igraph.Graph(n=1, directed=True, vertex_attrs={"tauler": t1})

  File "C:\Users\Stohl\anaconda3\lib\site-packages\igraph\__init__.py", line 232, in __init__
    self.vs[key] = value

TypeError: 'dict' object cannot be interpreted as an integer

Согласно учебному пособию iGraph,

Атрибуты могут быть произвольными Python объектами, но если вы сохраняете графики в файл, будут сохранены только строковые и числовые атрибуты c. См. Модуль pickle в стандартной библиотеке Python, если вы ищете способ сохранить другие типы атрибутов. Вы можете выбрать ваши атрибуты индивидуально, сохранить их как строки и сохранить их, или вы можете выбрать весь график, если вы знаете, что хотите загрузить график обратно только в Python.

I Я не уверен, что это мой случай, но я все равно пытался использовать модуль pickle, без какого-либо прогресса:

pickle.dumps(t2)
b'\x80\x03cmain_graf\nTauler\nq\x00)\x81q\x01}q\x02(X\x05\x00\x00\x00filesq\x03K\x07X\x08\x00\x00\x00columnesq\x04K\x0bX\x06\x00\x00\x00taulerq\x05}q\x06(K\x00]q\x07(K\x00K\x00K\x00K\x00K\x00K\x00K\x00K\x00K\x00K\x00K\x00eK\x01]q\x08(K\x00K\x00K\x00K\x00K\x00K\x00K\x00K\x00K\x00K\x00K\x00eK\x02]q\t(K\x00K\x00K\x00K\x00K\x01K\x00K\x00K\x00K\x00K\x00K\x00eK\x03]q\n(K\x00K\x00K\x00K\x01K\x02K\x00K\x00K\x00K\x01K\x00K\x00eK\x04]q\x0b(K\x00K\x00K\x00K\x01K\x01K\x02K\x02K\x00K\x02K\x00K\x01eK\x05]q\x0c(K\x00K\x00K\x00K\x02K\x01K\x02K\x01K\x00K\x02K\x01K\x02eK\x06]q\r(K\x00K\x01K\x02K\x02K\x02K\x01K\x01K\x02K\x01K\x01K\x02euub.'
# This seems to work fine

Но если я попробую следующее:

g = igraph.Graph(n=1, directed=True, vertex_attrs={"tauler": pickle.dumps(t2)})
g.vs[0]
igraph.Vertex(<igraph.Graph object at 0x000000000960CB88>, 0, {'tauler': 128})
# Why 128?? Why it is even an int?
pickle.loads(g.vs[0]["tauler"])
Traceback (most recent call last):

  File "<ipython-input-30-3b1c9e9c841a>", line 1, in <module>
    pickle.loads(g.vs[0]["tauler"])

TypeError: a bytes-like object is required, not 'int'

Таким образом, кажется, что метод pickle.dumps() работает, если я вызываю его с объектом Tauler, но когда я пытаюсь вызвать его при определении атрибута вершины, похоже, что он возвращает int вместо bytes объект.

Что мне здесь не хватает? Я провел несколько исследований по net и документации iGraph, но не смог найти ответ на этот вопрос.

Любая помощь будет очень признательна.

...