好吧,我正在尝试定义一个数据类,以在redis中为sidekiq工作者加入一个工作,sidekiq有效负载的规范要求某些属性具有以下格式:
{
"class": "SomeWorker",
"queue": "default"
"jid": "b4a577edbccf1d805744efa9", // 12-byte random number as 24 char hex string
"args": [......],
"created_at": 1234567890,
"enqueued_at": 1234567890
}
所以我在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"}
我的问题是我不能将“ class”定义为PusherNotificationJob的属性,因为它是保留字。因此,我需要定义asdict方法以将其序列化为dict并添加我在此处添加的“ class”属性。
有更好的方法吗?
答案 0 :(得分:1)
答案之前需要注意的几件事:只要代码正在运行,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__
如果您需要__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()}