Я могу «засечь локальные объекты», если я использую производный класс?
pickle
ссылкаговорится, что набор объектов, которые можно мариновать, весьма ограничен. Действительно, у меня есть функция, которая возвращает динамически сгенерированный класс, и я обнаружил, что не могу выбрать экземпляры этого класса:
>>> import pickle
>>> def f():
... class A: pass
... return A
...
>>> LocalA = f()
>>> la = LocalA()
>>> with open('testing.pickle', 'wb') as f:
... pickle.dump(la, f, pickle.HIGHEST_PROTOCOL)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: Can't pickle local object 'f.<locals>.A'
Такие объекты слишком сложны дляpickle
, Хорошо. Теперь, что волшебства в том, что, если я пытаюсь выбрать подобный объект, но производного класса, это работает!
>>> class DerivedA(LocalA): pass
...
>>> da = DerivedA()
>>> with open('testing.pickle', 'wb') as f:
... pickle.dump(da, f, pickle.HIGHEST_PROTOCOL)
...
>>>
Что тут происходит? Если это так просто, то почемуpickle
использовать этот обходной путь для реализацииdump
метод, который позволяет мариновать "локальные объекты"?