Python:无法腌制类型X,属性查找失败

发布于 2021-01-29 19:19:57

我正在尝试腌制namedtuple

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()

这将产生以下输出:

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

我究竟做错了什么?是,这个问题Bar是一个成员Foo?(将的定义Bar移到最高级别可以解决此问题,尽管我仍然很好奇为什么会这样。)

关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    是的,它是类成员这一事实是一个问题:

    >>> 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'>
    

    问题在于,当namedtuple()返回类型对象时,它不知道将其分配给类成员的事实-
    因此,它告诉类型对象其类型名称应为__main__.Bar,即使它确实应该为__main__.Foo.Bar



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看