数据类:如何使用 asdict() 忽略 None 值?

Dav*_* D. 7 python python-dataclasses

@dataclass
class Car:
    brand: str
    color: str
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到一个忽略 None 值的字典?就像是:

>>> car = Car(brand="Audi", color=None)
>>> asdict(car, some_option_to_ignore_none_values=True)
> {'brand': 'Audi'}
Run Code Online (Sandbox Code Playgroud)

Daw*_*zuk 27

所有答案都很好,但对我来说它们太冗长了。这是一行:

# dc is dataclass
# d is dict out
d = asdict(dc, dict_factory=lambda x: {k: v for (k, v) in x if v is not None})
Run Code Online (Sandbox Code Playgroud)

展示案例:

from typing import Optional, Tuple
from dataclasses import asdict, dataclass

@dataclass
class Space:
    size: Optional[int] = None
    dtype: Optional[str] = None
    shape: Optional[Tuple[int]] = None

s1 = Space(size=2)
s1_dict = asdict(s1, dict_factory=lambda x: {k: v for (k, v) in x if v is not None})
print(s1_dict)
# {"size": 2}

s2 = Space(dtype='int', shape=(2, 5))
s2_dict = asdict(s2, dict_factory=lambda x: {k: v for (k, v) in x if v is not None})
print(s2_dict)
# {"dtype": "int", "shape": (2, 5)}
Run Code Online (Sandbox Code Playgroud)


小智 5

老话题,但我希望这可以有所帮助:到目前为止,我发现执行此操作的最佳方法是使用元数据/配置排除选项:

from dataclasses import dataclass, field
from typing import Optional, Union
from dataclasses_json import LetterCase, dataclass_json, config
import pprint


def ExcludeIfNone(value):
    """Do not include field for None values"""
    return value is None

@dataclass_json(letter_case=LetterCase.CAMEL)
@dataclass
class Op:
    required: str
    optional: Optional[int] = field(metadata=config(exclude=ExcludeIfNone), default=None)


pp = pprint.PrettyPrinter(indent=4)
pp.pprint(clearsale.Op(required="test").to_dict())
pp.pprint(clearsale.Op(required="test", optional=10).to_dict())

Output:
{'required': 'test'}
{'optional': 10, 'required': 'test'}
Run Code Online (Sandbox Code Playgroud)