使用保留字“ class”定义数据类的属性并对其进行序列化

时间:2019-04-16 15:43:52

标签: python dictionary reserved-words python-dataclasses

好吧,我正在尝试定义一个数据类,以在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”属性。

有更好的方法吗?

1 个答案:

答案 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()}