gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:40:23 25 4
gpt4 key购买 nike

我正在尝试 pickle 一个 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

我做错了什么? BarFoo 的成员的问题吗? (将 Bar 的定义移到顶层可以解决问题,尽管我仍然很好奇为什么会发生这种情况。)

最佳答案

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

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

关于Python:无法 pickle 类型 X,属性查找失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4677012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com