我希望能够对一些字典执行静态类型检查(使用vscode
里的pylance
)。 "棘手" 的部分是,我希望其中一些参数是可选的,且在字典中不显示。 我尝试过使用dataclasses
和TypedDict
,但到目前为止都没有成功。
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_order
并不满意。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"}],
}
编辑
我已经在pylance
中添加了一个错误报告,因为这可能实际上是pylance
/ pyright
中的错误。
sub_orders
设置一个default_factory
为list
,而不是将其标记为Optional
。 - user2357112Optional[Whatever]
并不意味着可选。它的意思是Union[Whatever, None]
。 - user2357112sub_orders
根本不是字典的一部分。 - mr.bjerre