python - 如何为 python NamedTuple 实现 "varying"默认参数

标签 python namedtuple

我有一个NamedTuple,其属性之一是一个不断变化的变量,该变量取决于初始化实例的上下文。对于一个最小的例子,它应该是这样的

import pandas as pd
import datetime

class Record(NamedTuple):
    """
    Immutable record objects
    """
    data: dict
    timestamp: pd.Timestamp


# initiation
# I want the timestamp to be the current time
record = Record(data={'x': 1}, timestamp=datetime.datetime.now())

上面的代码可以正常工作,但我不想向用户公开 timestamp attr。相反,我想要的是这样的,将 timestamp 设置为 default arg,但不会失去其对启动上下文的独立性:

import pandas as pd
import datetime
import time

class Record(NamedTuple):
    """
    Immutable record objects
    """
    data: dict
    timestamp: pd.Timestamp = datetime.datetime.now()


# initiation, not producing desired output though
record1 = Record(data={'x': 1})
time.sleep(1)
record2 = Record(data={'x': 1})

# expected 1s apart, but actually are the same
print(record1.timestamp, record2.timestamp)

我希望 record.timestamp 是启动时间,但显然它是类声明的时间,即从一开始就“固定”,这是不希望的。

执行此操作的最佳做​​法是什么?

从实用的角度来看,确实,将 timestamp 参数留给外部赋值似乎并没有什么坏处,但我只是想避免它,因为代码简洁。

最佳答案

我认为使用命名元组无法实现这一点。

如果您想要一个“某种”不可变的数据对象,您可以使用卡住数据类:

import pandas as pd
import datetime
from dataclasses import dataclass, field
import time

@dataclass(frozen=True)
class Record:
    data: dict
    timestamp: pd.Timestamp = field(default_factory=datetime.datetime.now)

record1 = Record(data={'x': 1})
time.sleep(1)
record2 = Record(data={'x': 1})

print(record1.timestamp, record2.timestamp)

关于python - 如何为 python NamedTuple 实现 "varying"默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58610779/

相关文章:

python-3.x - Numba 命名元组签名

c++ - Python NamedTuple 到 C++ 结构

Python Kivy 不会使用 SDL2,坚持使用 pygame

python - 如何使用时区感知日期过滤模型?

python - Matplotlib:使用另一张图像对灰度图像进行着色

python - 如何在 python 中访问 nametuples 中的元素?

python - 具有 Lambda 值的字典更新所有条目

python - 在 namedtuple 中使用 '_' 作为 typename 有什么特别之处吗?

python - 如何使用 Github 操作让 Selenium 测试在 python 中运行?

python - 单击确定后执行功能(QDialogBu​​ttonBox)