x = []
的正确类型提示是什么?
我的PyCharm编辑器中的类型检查器将此标记为错误:
labelframes: List[ttk.LabelFrame] = []
'可选'不是一个选项,如:
labelframes: List[Optional[ttk.LabelFrame]] = []
因为typing.Optional
的文档声明这相当于:
labelframes: List[Union[ttk.LabelFrame, None]] = []
且[None]
不是[]
。
我应该提到PyCharm也不喜欢这样:
labelframes: List[Union[ttk.LabelFrame, None]] = [None]
无论我尝试什么类型的提示。 PyCharm将其标记为错误, “预计会返回我的类型提示,没有回复,”所以我试过了:
labelframes: Optional[List[ttk.LabelFrame, None]] = []
那不起作用。
我知道PEP 526有许多遵循这种模式的例子:
x: List[str] = []
答案 0 :(得分:3)
观察PEP 484,特别是the section on type comments(变量注释的前身),这确实看起来像是PyCharm检查器的错误。
从PEP引用:
在非存根代码中,有一个类似的特殊情况:
from typing import IO stream = None # type: IO[str]
类型检查器不应该抱怨这一点(尽管值
None
与给定类型不匹配),也不应该将推断类型更改为Optional[...]
(尽管规则对于带注释的参数执行此操作默认值为None)。这里的假设是其他代码将确保变量被赋予适当类型的值,并且所有使用都可以假设变量具有给定类型。
因此,以类似的方式,类型检查器(如mypy
目前所做的那样),不应该抱怨您提供的初始化值与注释不完全匹配的事实。