如何在没有任何字段的情况下从课堂上创建dict



我有以下数据类:

@dataclass
class Image:
    content_type: str
    data: bytes = b''
    id: str = ""
    upload_date: datetime = None
    size: int = 0
    def to_dict(self) -> Dict[str, Any]:
        result = {}
        if self.id:
            result['id'] = self.id
        if self.content_type:
            result['content_type'] = self.content_type
        if self.size:
            result['size'] = self.size
        if self.upload_date:
            result['upload_date'] = self.upload_date.isoformat()
        return result

有什么方法可以简化to_dict方法?我不想使用if列出所有字段。

按照Meowgoesthedog的建议,您可以使用asdict并过滤结果以跳过虚假值:

from dataclasses import dataclass, asdict
from datetime import datetime
from typing import Dict, Any
@dataclass
class Image:
    content_type: str
    data: bytes = b''
    id: str = ""
    upload_date: datetime = None
    size: int = 0
    def to_dict(self) -> Dict[str, Any]:
        return {k: v for k, v in asdict(self).items() if v}
print(Image('a', b'b', 'c', None, 0).to_dict())
# {'content_type': 'a', 'data': b'b', 'id': 'c'}

您可以使用vars方法在Python中获得类对象的dict表示。

首先,您需要在课堂内实现__setattr__。在您的班级中添加此方法。

def __setattr__(self, name, value):
    if value is not None:
        self.__dict__[name] = value
    if value is not None and name == 'upload_date':
        self.__dict__[name] = value.isoformat()

这将防止None字段添加到类dict中。

>>> img = Image(content_type='something')
>>> vars(i)
{'content_type': 'something', 'data': b'', 'id': '', 'size': 0}

但是,使用dataclasses.asdict仍将保留None字段。

>>> import dataclasses
>>> img = Image(content_type='something')
>>> dataclasses.asdict(img)
{'content_type': 'something', 'data': b'', 'id': '', 'upload_date': None, 'size': 0}

但是您可以使用vars,因为它可以使用。object.__dict__返回与vars(object)

相同的东西

相关内容

最新更新