为什么 PyCharm 不接受我的空列表类型提示?

问题描述 投票:0回答:2

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] = []
python pycharm python-typing
2个回答
15
投票

查看 PEP 484,特别是有关类型注释的部分(变量注释的前身),这确实看起来像是 PyCharm 检查器的错误。

引用PEP:

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

from typing import IO

stream = None  # type: IO[str]

类型检查器不应抱怨这一点(尽管值

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

因此,以类似的方式,类型检查器(如

mypy
目前所做的那样)不应该抱怨您提供的初始化值与注释不严格匹配的事实。


5
投票

我们首先为一个空列表编写示例代码并使用 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
© www.soinside.com 2019 - 2024. All rights reserved.