+-
python – 从以前的字段向NamedTuple添加字段
假设我想存储一些关于会议日程的信息,其中包括演示时间和暂停时间.我可以在NamedTuple中做到这一点.

from typing import NamedTuple

class BlockTime(NamedTuple):
    t_present: float
    t_pause: float

但是,如果我还想存储每个块将采取多少t_each = t_pause t_present,我不能只将它添加为属性:

class BlockTime(NamedTuple):
    t_present: float
    t_pause: float
    # this causes an error
    t_each = t_present + t_pause

在Python中执行此操作的正确方法是什么?如果我创建一个__init __(self)方法并将其存储为实例变量,那么它将是可变的.

最佳答案
如果没有真正存储但动态计算你可以使用一个简单的属性.

from typing import NamedTuple

class BlockTime(NamedTuple):
    t_present: float
    t_pause: float
    @property
    def t_each(self):
        return self.t_present + self.t_pause

>>> b = BlockTime(10, 20)
>>> b.t_each  # only available as property, not in the representation nor by indexing or iterating
30

这样做的好处是你永远不会(甚至不小心)为它存储错误的值.但是以牺牲实际上根本不存储它为代价.因此,为了显示它是否存储,你必须至少覆盖__getitem __,__ iter _,_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

例如,Patrick Haugh给出的NamedTuple方法有一个缺点,即仍然可能创建不一致的BlockTimes或丢失部分命名元组的便利:

>>> b = BlockTime.factory(1.0, 2.0)
>>> b._replace(t_present=20)
BlockTime(t_present=20, t_pause=2.0, t_each=3.0)

>>> b._make([1, 2])
TypeError: Expected 3 arguments, got 2

事实上,你实际上有一个必须与其他字段同步的“计算”字段已经表明你可能根本不应该存储它以避免不一致的状态.

点击查看更多相关文章

转载注明原文:python – 从以前的字段向NamedTuple添加字段 - 乐贴网