Сериализация метода Python с глобальными переменными от dill - PullRequest
0 голосов
/ 16 ноября 2018

Вот пример кода, где FLAG - глобальная переменная.Метод A.func для меня является черным ящиком, так что я не знаю, он вызывает FLAG перед сериализацией.

import dill as pickle
FLAG = 100

class A:
  def func(self):
    print FLAG * 10

a = A()
dump = pickle.dumps(a.func)
del FLAG
foo = pickle.loads(dump) <-- fail here "NameError: global name 'FLAG' is not defined"
foo()

В связанных вопросах:

Наиболее практичным решением является использование cloudpickle.Но кажется, что dill более устойчив, чем cloudpickle.Поэтому я хотел бы придерживаться dill или других зрелых сборщиков.

Я не против изменить какой-либо код dill самостоятельно при необходимости.

Спасибо за любую помощь взаранее :)

1 Ответ

0 голосов
/ 17 ноября 2018

Я dill автор.Это работает, если вы используете настройку recurse, которая обрабатывает глобальные переменные очень похоже на то, как cloudpickle обрабатывает глобальные переменные.

>>> import dill
>>> FLAG = 100
>>> 
>>> class A:
...   def func(self):
...     return FLAG*10
... 
>>> a = A()
>>> dump = dill.dumps(a.func, recurse=True)
>>> del FLAG
>>> foo = dill.loads(dump)
>>> foo()
1000
>>> 

dill предоставляет несколько настроек, которые предоставляют вам варианты сериализации.Если вы хотите всегда использовать этот параметр, вы можете сделать это:

>>> dill.settings['recurse'] = True
...