Python: no se puede encurtir el tipo X, falló la búsqueda de atributos
Estoy tratando de encurtir unnamedtuple
:
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()
Esto produce el siguiente resultado:
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
¿Qué estoy haciendo mal? Es el problema queBar
es miembro deFoo
? (Mover la definición deBar
al nivel superior resuelve el problema, aunque todavía tengo curiosidad por qué sucede esto).