Je me permet de “cornichon objets locaux” si j'utilise une classe dérivée?

La pickle référence les états qui de l'ensemble des objets qui peuvent être traitées est plutôt limitée. En effet, j'ai une fonction qui retourne un dinamically-classe générée, et je l'ai trouvé je ne peux pas pickle instances de cette classe:

>>> 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'

De tels objets sont trop compliqués pour pickle. Ok. Maintenant, ce qui est magique, c'est que, si j'essaie de pickle un objet similaire, mais d'une classe dérivée, il fonctionne!

>>> class DerivedA(LocalA): pass
... 
>>> da = DerivedA()
>>> with open('testing.pickle', 'wb') as f:
...     pickle.dump(da, f, pickle.HIGHEST_PROTOCOL)
...
>>>

Ce qui se passe ici? Si c'est si facile, pourquoi ne pas pickle utiliser cette solution de contournement à mettre en œuvre un dump méthode qui permet de "objets locaux" pour être nettoyée?

OriginalL'auteur fonini | 2016-05-03