如何为 python NamedTuple 实现 "varying" 默认参数
How to implement "varying" default args for 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
属性。相反,我想要的是这样的,将 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
是开始的时间,但显然它是 class 声明的时间,即 "fixed" 从一开始就是不可取的。
执行此操作的最佳做法是什么?
从实用的角度来看,确实,将 timestamp
arg 留给外部赋值似乎并没有什么坏处,但我只是想避免它,因为代码干净。
我不认为你可以用命名元组实现它。
如果您想要一个不可变的数据对象"of sorts",您可以使用冻结的数据类:
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)
我有一个 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
属性。相反,我想要的是这样的,将 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
是开始的时间,但显然它是 class 声明的时间,即 "fixed" 从一开始就是不可取的。
执行此操作的最佳做法是什么?
从实用的角度来看,确实,将 timestamp
arg 留给外部赋值似乎并没有什么坏处,但我只是想避免它,因为代码干净。
我不认为你可以用命名元组实现它。
如果您想要一个不可变的数据对象"of sorts",您可以使用冻结的数据类:
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)