Her*_*sta 9 python dictionary reserved-words python-dataclasses
好的,我正在尝试定义一个数据类来为 sidekiq 工作人员在 redis 中排队作业,sidekiq 有效负载的规范需要一些具有以下格式的属性:
{
"class": "SomeWorker",
"queue": "default"
"jid": "b4a577edbccf1d805744efa9", // 12-byte random number as 24 char hex string
"args": [......],
"created_at": 1234567890,
"enqueued_at": 1234567890
}
Run Code Online (Sandbox Code Playgroud)
所以我在我的 python 代码中定义了一个数据类:
@dataclass
class PusherNotificationJob:
args: Any = None
queue: str = "default"
jid: str = secrets.token_hex(12)
retry: bool = True
created_at: datetime.datetime = time.time()
enqueued_at: datetime.datetime = time.time()
def asdict(self):
return {** self.__dict__, "class": "SomeWorker"}
Run Code Online (Sandbox Code Playgroud)
我的问题是我无法将“类”定义为 PusherNotificationJob 的属性,因为它是一个保留字。所以我需要定义 asdict 方法来序列化为 dict 并添加我在这里添加的“class”属性。
有没有更好的方法来做到这一点?
在回答之前需要注意一些事情:只要您的代码正在运行,created_at 和 enqueued_at 将具有相同的值...如果您希望时间是创建实例的时间,请使用:
created_at: datetime.datetime = field(default_factory=time.time)
继续:
您可以覆盖__iter__以使用dict(instance). 如果你有一个名为的属性,它会像下面这样class_: str = 'SomeWorker'
def __iter__(self):
for key in self.__dict__:
if key == 'class_':
key = 'class'
yield key, self.__dict__
Run Code Online (Sandbox Code Playgroud)
如果您需要__iter__正常表现,请使用以下内容:
def convert_keys(self):
for key in self.__dict__:
value = self.__dict__[key]
if key == 'class_':
key = 'class'
yield key, value
def asdict(self):
return {key: value for key, value in self.convert_keys()}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |