gpt4 book ai didi

python - 从以前的字段向 NamedTuple 添加字段

转载 作者:太空宇宙 更新时间:2023-11-03 13:59:10 25 4
gpt4 key购买 nike

假设我想存储一些关于 session 日程的信息,包括演示时间和暂停时间。我可以在 NamedTuple 中执行此操作。

from typing import NamedTuple

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

但是,如果我还想存储每个 block 需要多少时间使得 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____repr__ 这可能太麻烦了.

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

>>> 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 添加字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51275426/

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