Я пытаюсь создать граф с 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, но не смог найти ответ на этот вопрос.
Любая помощь будет очень признательна.