Próbuję marynowane namedtuple
:Python: Czy nie zalewa typu X, atrybut wyszukiwania udało
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()
To daje następujący wynik:
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
Co robię źle? Czy problem polegający na tym, że Bar
jest członkiem Foo
? (Moving definicję Bar
na najwyższym poziomie rozwiązuje problemu, chociaż wciąż jestem ciekaw, dlaczego tak się dzieje.)
Korzystanie python3 i marynowane Protokół 4 poprawki to –