Python: Can’t pickle type X, attribute lookup failed

Yes, the fact that it’s a class member is a problem:

>>> class Foo():
...     Bar = namedtuple('Bar', ['x','y'])
...     def baz(self):
...         b = Foo.Bar(x=2, y=3)
...         print(type(b))
...
>>> a = Foo()
>>> a.baz()
<class '__main__.Bar'>

The problem is that when namedtuple() returns a type object, it isn’t aware of the fact that it’s being assigned to a class member – and thus, it tells the type object that its type name should be __main__.Bar, even though it should really be __main__.Foo.Bar.

Leave a Comment