9

好的,我正在尝试定义一个数据类来为 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
 }

所以我在我的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"}

我的问题是我不能将“类”定义为 PusherNotificationJob 的属性,因为它是保留字。所以我需要定义 asdict 方法来序列化为 dict 并添加我在这里添加的“类”属性。

有更好的方法来做到这一点吗?

4

1 回答 1

2

在回答之前需要注意的几件事: 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()}
于 2020-08-15T02:32:15.137 回答