您的类型检查器在使用
给定此自定义TypedDict
TMyDict
:
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
,那么代码就更清晰了。