x = []
的正确类型提示是什么?
我的 PyCharm 编辑器中的类型检查器将此标记为错误:
labelframes: List[ttk.LabelFrame] = []
Optional
不是一个选项,如下所示:
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] = []
查看 PEP 484,特别是有关类型注释的部分(变量注释的前身),这确实看起来像是 PyCharm 检查器的错误。
引用PEP:
在非存根代码中,还有类似的特殊情况:
from typing import IO stream = None # type: IO[str]
类型检查器不应抱怨这一点(尽管值
与给定类型不匹配),也不应将推断类型更改为None
(尽管规则对默认值为 None 的带注释参数执行此操作) 。这里的假设是其他代码将确保为变量赋予正确类型的值,并且所有使用都可以假设该变量具有给定类型。Optional[...]
因此,以类似的方式,类型检查器(如
mypy
目前所做的那样)不应该抱怨您提供的初始化值与注释不严格匹配的事实。
我们首先为一个空列表编写示例代码并使用 mypy 检查它。
from typing_extensions import reveal_type
l = []
reveal_type(l)
现在让我们在 shell 中运行它,如下所示。
$ mypy test.py
test.py:4: error: Need type annotation for "l" (hint: "l: List[<type>] = ...")
test.py:6: note: Revealed type is "builtins.list[Any]"
Found 1 error in 1 file (checked 1 source file)
现在请注意第二行,因为它表示类型是
List[Any]
。
让我们进行更改并重新运行
from typing import Any, List
from typing_extensions import reveal_type
l : List[Any] = []
reveal_type(l)
现在运行 mypy。
$ mypy test.py
test.py:6: note: Revealed type is "builtins.list[Any]"
Success: no issues found in 1 source file