Python: não é possível selecionar o tipo X, a pesquisa de atributo falhou
Eu estou tentando escolher umanamedtuple
:
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()
Isso produz a seguinte saída:
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
O que estou fazendo errado? É o problema queBar
é um membro deFoo
? (Movendo a definição deBar
para o nível superior resolve o problema, embora ainda esteja curioso para saber por que isso acontece.)