gpt4 book ai didi

python - 为什么我不能 pickle typing.NamedTuple 而我可以 pickle collections.namedtuple?

转载 作者:太空狗 更新时间:2023-10-29 18:08:39 26 4
gpt4 key购买 nike

为什么我不能 pickle typing.NamedTuple 而我可以 pickle collections.namedtuple?我如何设法 pickle NamedTuple

这段代码展示了我到目前为止所做的尝试:

from collections import namedtuple
from typing import NamedTuple

PersonTyping = NamedTuple('PersonTyping', [('firstname',str),('lastname',str)])
PersonCollections = namedtuple('PersonCollections', ['firstname','lastname'])

pt = PersonTyping("John","Smith")
pc = PersonCollections("John","Smith")


import pickle
import traceback

try:
with open('personTyping.pkl', 'wb') as f:
pickle.dump(pt, f)
except:
traceback.print_exc()
try:
with open('personCollections.pkl', 'wb') as f:
pickle.dump(pc, f)
except:
traceback.print_exc()

外壳上的输出:

$ python3 prova.py 
Traceback (most recent call last):
File "prova.py", line 16, in <module>
pickle.dump(pt, f)
_pickle.PicklingError: Can't pickle <class 'typing.PersonTyping'>: attribute lookup PersonTyping on typing failed
$

最佳答案

这是一个错误。我已经在上面开票了:http://bugs.python.org/issue25665

问题是 namedtuple创建类时的函数通过从调用框架的全局变量中查找 __name__ 属性来设置其 __module__ 属性。在这种情况下,调用者是 typing.NamedTuple

result.__module__ = _sys._getframe(1).f_globals.get('__name__', '__main__')

因此,在这种情况下,它最终将其设置为 'typing'

>>> type(pt)
<class 'typing.PersonTyping'> # this should be __main__.PersonTyping
>>> type(pc)
<class '__main__.PersonCollections'>
>>> import typing
>>> typing.NamedTuple.__globals__['__name__']
'typing'

修复:

取而代之的是 NamedTuple函数应自行设置:

def NamedTuple(typename, fields):

fields = [(n, t) for n, t in fields]
cls = collections.namedtuple(typename, [n for n, t in fields])
cls._field_types = dict(fields)
try:
cls.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__')
except (AttributeError, ValueError):
pass
return cls

现在您还可以:

PersonTyping = NamedTuple('PersonTyping', [('firstname',str),('lastname',str)])
PersonTyping.__module__ = __name__

关于python - 为什么我不能 pickle typing.NamedTuple 而我可以 pickle collections.namedtuple?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33796490/

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