Использование декоратора @register в укропе - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь решить проблему, аналогичную описанной в Определение класса Pickle в модуле с укропом . По сути, у меня есть класс BaseType, и я хочу, чтобы любые дочерние классы BaseType были полностью сериализованы, когда я укроповал объект этого типа, а не просто сохранил ссылку. Я попытался решить эту проблему, используя @register decorator, чтобы изменить способ сохранения ClassType (насколько я понимаю, это меняет функцию Reduce в таблице отправки pickle).

@register(ClassType)
def save_classobj(pickler, obj):
    if obj.__module__ == '__main__':# or issubclass(obj, Example):
         pickler.save_reduce(ClassType, (obj.__name__, obj.__bases__,
                                    obj.__dict__), obj=obj)

    else:# obj != MappingProxyType and obj != CodeType:
        StockPickler.save_global(pickler, obj)

    return

Однако даже когда я копирую ту же самую функцию из исходного кода укропа, у которого уже есть декоратор @register (ClassType), я внезапно получаю кучу ошибок, когда укроп пытается перебрать встроенные классы ,

File "/usr/lib64/python3.6/pickle.py", line 922, in save_global
     (obj, module_name, name))
_pickle.PicklingError: Can't pickle <class 'mappingproxy'>: it's not found as builtins.mappingproxy

Как этого избежать?

...