为什么我不能泡菜键入.NamedTuple当我可以腌collections.namedtuple?

2024-10-03 23:18:24 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么我不能腌制一个typing.NamedTuple,而我可以腌制一个collections.namedtuple?我怎样才能做pickle aNamedTuple?在

这段代码显示了我目前所做的努力:

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

外壳上的输出:

^{pr2}$

Tags: fromimportpttypingfirstnamejohnnamedtuplecollections
1条回答
网友
1楼 · 发布于 2024-10-03 23:18:24

这是个虫子。我在上面开了一张票:http://bugs.python.org/issue25665

问题是在创建类时,^{}函数通过从调用帧的全局参数中查找__name__属性来设置其__module__属性。在本例中,调用者是typing.NamedTuple。在

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

因此,在本例中,它最终设置为'typing'。在

^{pr2}$

修复:

与其这样,^{}函数应该自己设置它:

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__

相关问题 更多 >