python - 我可以在数据类中有一个在转换为 dict 时省略的可选参数吗?

标签 python python-typing python-dataclasses pyright

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

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"}],
}
这可以通过 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"}],
}
编辑
我添加了一个 bug reportpylance因为这实际上可能是 pylance 中的一个错误/pyright

最佳答案

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)
ValidatedDC - https://github.com/EvgeniyBurdin/validated_dc

关于python - 我可以在数据类中有一个在转换为 dict 时省略的可选参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62824000/

相关文章:

Python:识别文件夹结构中的数字名称文件夹

javascript - AJAX:通过包含 '&' 字符的 CGI 传递字符串

python - 将 Typing 和 Mypy 与描述符一起使用

python - 为仅返回一组特定值的函数键入提示

python-3.x - Mypy 提示明显的 bool 表达式违反了 [no-any-return] 规则

python - Python 3.7 数据类中的类继承

python - 我可以有一个简单的数据类字段列表吗

python - 字典每个键分为多行

python - 如何防止plotly自动出图

python - 如何将列表作为参数传递给数据类?类型错误 : __init__() missing required positional arguments