空列表的正确类型提示是什么?

时间:2017-07-23 10:46:08

标签: python python-3.x type-hinting typing

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] = []

1 个答案:

答案 0 :(得分:3)

观察PEP 484,特别是the section on type comments(变量注释的前身),这确实看起来像是PyCharm检查器的错误。

从PEP引用:

  

在非存根代码中,有一个类似的特殊情况:

from typing import IO

stream = None  # type: IO[str]
     

类型检查器不应该抱怨这一点(尽管值None与给定类型不匹配),也不应该将推断类型更改为Optional[...](尽管规则对于带注释的参数执行此操作默认值为None)。这里的假设是其他代码将确保变量被赋予适当类型的值,并且所有使用都可以假设变量具有给定类型。

因此,以类似的方式,类型检查器(如mypy目前所做的那样),不应该抱怨您提供的初始化值与注释不完全匹配的事实。