"dict[str, Unknown]"与我的自定义TypedDict不兼容



给定此自定义TypedDictTMyDict:

class TMyDict(TypedDict, total=False):
prop_a: int
prop_b: int

可以:

def get_my_dict_works() -> TMyDict:
return {
'prop_a': 0,
'prop_b': 1
}

但这不是:

def get_my_dict_fail() -> TMyDict:
d= {
'prop_a': 0,
'prop_b': 1
}
return d

错误信息是:

Expression of type "dict[str, Unknown]" cannot be assigned to return type "TMyDict"
"dict[str, Unknown]" is incompatible with "TMyDict"

如果我在赋值var时添加类型注释,它就能工作了:

def get_my_dict_fix() -> TMyDict:
d: TMyDict = {
'prop_a': 0,
'prop_b': 1
}
return d

为什么?

您的类型检查器在使用d之前确定了它的类型

为了提高性能并保持类型推断简单,类型检查器通常只扫描一次代码,并在赋值变量时尝试确定变量的类型。它看到了

一行
d = {
'prop_a': 0,
'prop_b': 1
}

,假设d: dict[str, int]d: dict[str, Unknown]。如果类型检查器试图接受您的代码,那么当d被用作TMyDict时,它必须在使用d之前跳回并检查所有内容。这样做的成本可能非常高,而且由于只需添加注释就可以修复错误,因此大多数类型检查器都不支持这样做。此外,如果用户可以直接看到d应该是TMyDict,而不是任何dict,那么代码就更清晰了。

最新更新