2016-02-09 2 views
0

Почему нет возможности сериализовать методы igraph.Graph с рассолом или укропом? Оба подхода дают PicklingError.Почему методы igraph.Graph ни «разборчивые», ни «укротительные»?

Пример:

import igraph, dill, pickle 

pickle.dumps(igraph.Graph.degree) 
dill.dumps(igraph.Graph.degree) 

Здесь оба вызовы dumps конца с исключением:

PicklingError        Traceback (most recent call last) 
... 
PicklingError: Can't pickle <class 'igraph.Graph'>: it's not the same object as igraph.Graph 

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

def degree_wrapper(graph, *args, **kwargs): 
    return graph.degree(*args, **kwargs) 

Есть ли другой способ сделать укропную работу для этих случаев?

fyi: python-igraph == 0.7.1.post6; укроп == 0.2.5; Python 3.4.3+ (по умолчанию, окт. 14 2015, 16:03:50) [GCC 5.2.1 20151010]; Ubuntu 15.10

ответ

1

Я не думаю, что это специфично для igraph; документация о pickle модуля содержит список объектов, которые могут быть солеными:

следующие типы можно маринованные:

  • Нет, правда, и Ложные
  • целые, длинные целые числа, числа с плавающей точкой , комплексные числа
  • нормальные и Unicode строки
  • кортежи, списки, множества и словари, содержащие только объекты пригодны для консервирования
  • функции, определенные на верхнем уровне модуля
  • встроенные функции, определенной на верхнем уровне модуля
  • классов, которые определены на верхнем уровне модуля
  • экземпляры таких классов, чьи __dict__ или результат звонка __getstate__() является сорбируемым (подробности см. в разделе Протокол рассола).

Способ по Graph класса degree не соответствует ни одному из перечисленных выше категорий. Ваша функция работает, потому что она (предположительно) определена на верхнем уровне модуля.

Что касается dill, я понятия не имею, но поскольку он построен на pickle, можно предположить, что те же ограничения применимы и к dill.