我可以在数据类中有一个可选参数,当转换为 dict 时可以省略该参数吗?

mr.*_*rre 15 python python-dataclasses python-typing pyright

我希望对某些字典执行静态类型检查( pylancein )。vscode“棘手”的部分是我希望一些参数是可选的并且根本不显示在字典中。我尝试过使用dataclassesandTypedDict但到目前为止还没有运气。

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


@dataclass
class SubOrder:
    name: str


@dataclass
class Order:
    name: str
    sub_orders: Optional[List[SubOrder]]


assert asdict(Order(name="Pizza")) == {"name": "Pizza"}
assert asdict(Order(name="Pizza", sub_orders=[SubOrder(name="Pasta")])) == {
    "name": "Pizza",
    "sub_orders": [{"name": "Pasta"}],
}
Run Code Online (Sandbox Code Playgroud)

这是可以实现的吗dataclasses?我基本上只是希望我的静态类型检查器 ( pylance/ pyright) 来检查我的字典,这就是我使用dataclasses. 我也尝试过TypedDict,但类型检查器的行为似乎不像我那样。他们总是要求我设置sub_orders

以下代码通过了,但pylance对没有 感到不满意sub_orders

from typing import Optional, List, TypedDict


class SubOrder(TypedDict):
    name: str


class Order(TypedDict):
    name: str
    sub_orders: Optional[List[SubOrder]]


assert Order(name="Pizza") == {"name": "Pizza"}
assert Order(name="Pizza", sub_orders=[SubOrder(name="Pasta")]) == {
    "name": "Pizza",
    "sub_orders": [{"name": "Pasta"}],
}
Run Code Online (Sandbox Code Playgroud)

编辑

我添加了一个错误报告,因为这实际上可能是/pylance中的一个错误pylancepyright

Evg*_*din 11

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

from validated_dc import ValidatedDC


@dataclass
class SubOrder(ValidatedDC):
    name: str


@dataclass
class Order(ValidatedDC):
    name: str
    sub_orders: Optional[List[SubOrder]] = None

    def as_dict(self):
        data = asdict(self)
        return {key: value for key, value in data.items() if value is not None}


data = {'name': 'pizza'}
order = Order(**data)
assert order.get_errors() is None
assert asdict(order) == {'name': 'pizza', 'sub_orders': None}
assert order.as_dict() == {'name': 'pizza'}

data = {'name': 'pizza', 'sub_orders': [{'name': 'pasta'}]}
order = Order(**data)
assert order.get_errors() is None
assert asdict(order) == {'name': 'pizza', 'sub_orders': [{'name': 'pasta'}]}
assert isinstance(order.sub_orders[0], SubOrder)
Run Code Online (Sandbox Code Playgroud)

ValidatedDC - https://github.com/EvgeniyBurdin/validated_dc


Pra*_*nav 9

您可以通过设置默认值在数据类中拥有可选参数,例如空字符串""None.

from dataclasses import dataclass
from typings import Optional


@dataclass
class SubOrder:
    n: Optional[int] = None
    name: str = ""
Run Code Online (Sandbox Code Playgroud)

  • 有没有理由说这应该是一个 str ?对于通用非 str 参数使用 None 是否有效? (4认同)