Sto cercando di fare la serializzazione un namedtuple
:Python: Impossibile salamoia tipo X, attributo di ricerca fallita
from collections import namedtuple
import cPickle
class Foo:
Bar = namedtuple('Bar', ['x', 'y'])
def baz(self):
s = set()
s.add(Foo.Bar(x=2, y=3))
print cPickle.dumps(s)
if __name__ == '__main__':
f = Foo()
f.baz()
Questo produce il seguente output:
Traceback (most recent call last):
File "scratch.py", line 15, in <module>
f.baz()
File "scratch.py", line 11, in baz
print cPickle.dumps(s)
cPickle.PicklingError: Can't pickle <class '__main__.Bar'>: attribute lookup __main__.Bar failed
Che cosa sto facendo di sbagliato? Il problema è che Bar
è un membro di Foo
? (Spostare la definizione di Bar
al livello superiore risolve il problema, anche se io sono ancora curioso di sapere perchè questo accade.)
Utilizzando python3 e sottaceto protocollo 4 fissa questo –