Я пытался выбрать объект, который содержит ссылки на методы статического класса.
Pickle завершается неудачно (например, на module.MyClass.foo
), заявляя, что его невозможно засолить, так как module.foo
не существует.
Я пришел к следующему решению, используя объект-оболочку для определения местоположения функции при вызове, сохраняя класс контейнера и имя функции:
class PicklableStaticMethod(object):
"""Picklable version of a static method.
Typical usage:
class MyClass:
@staticmethod
def doit():
print "done"
# This cannot be pickled:
non_picklable = MyClass.doit
# This can be pickled:
picklable = PicklableStaticMethod(MyClass.doit, MyClass)
"""
def __init__(self, func, parent_class):
self.func_name = func.func_name
self.parent_class = parent_class
def __call__(self, *args, **kwargs):
func = getattr(self.parent_class, self.func_name)
return func(*args, **kwargs)
Мне вот интересно, есть ли лучший - более стандартный способ - засолить такой объект?
Я не хочу вносить изменения в глобальный процесс pickle
(используя, например, copy_reg
), но следующий шаблон был бы полезен:
Класс MyClass (объект):
@picklable_staticmethod
def foo ():
печать "готово".
Мои попытки не увенчались успехом, особенно потому, что я не смог извлечь класс владельца из функции foo
. Я даже был готов согласиться на явную спецификацию (например, @picklable_staticmethod(MyClass)
), но я не знаю, как можно ссылаться на класс MyClass
там, где он определяется.
Любые идеи будут великолепны!
Йонатан