0
0 комментариев

Здравствуйте! Мне очень понадобилось сериализовать функцию на основе метода класса и я решил сделать это с помощью dill, так как pickle функции сериализовать к сожалению не умеет. В процессе я столкнулся с неожиданной проблемой — если функция использует метод класса, объявленный в другом файле, то возникает неожиданная проблема.

[./old_context/dill_dump.py]
import dill
from a import A
 
if __name__ == '__main__':
  a = A()
  with open('test.txt', 'w') as output_stream:
    output_stream.write(a.dumps())
 
 
[./old_context/a.py]
import dill
 
class A(object):
  def __init__(self):
    pass
  def dummy(self, x):
    return x
  def dumps(self):
    return dill.dumps({'dummy', lambda(x): self.dummy(x)})
 
 
[./new_context/dill_load.py]
import dill
 
if __name__ == '__main__':
  with open('test.txt') as input_stream:
    a = dill.loads(input_stream.read())
  print(a['dummy'](123))
 
agrin@agrin-Aspire-ES1-131:~/Projects/test/dill/new_context$ python dill_load.py
Traceback (most recent call last):
  File "dill_load.py", line 5, in <module>
    a = dill.loads(input_stream.read())
  File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 299, in loads
    return load(file)
  File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 288, in load
    obj = pik.load()
  File "/usr/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1090, in load_global
    klass = self.find_class(module, name)
  File "/usr/local/lib/python2.7/dist-packages/dill/dill.py", line 445, in find_class
    return StockUnpickler.find_class(self, module, name)
  File "/usr/lib/python2.7/pickle.py", line 1124, in find_class
    __import__(module)
ImportError: No module named a

Чет так не работает, а вот если класс A объявлен в dill_dump.py, то все в порядке. Можно ли как-нибудь сериализовать функцию в подобной ситуации и если да, то как?


Добавить комментарий