【问题标题】:What is the correct type hint for an empty list?空列表的正确类型提示是什么?
【发布时间】:2017-12-29 01:43:17
【问题描述】:

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

【问题讨论】:

  • x: List[str] = [] 是否在您的编辑器中工作?
  • @JohnZwinck。我不清楚您所说的“在我的编辑器中工作”是什么意思。我的编辑器的类型检查器将此标记为错误。否则类型提示将被忽略,并且对 Python 的操作没有影响。除了类型检查之外,代码的执行就像我写的一样,labelframes = []
  • mypy 没有问题,所以我有足够的信心说这可能是 Pycharm 的类型检查器中的一个错误。在他们的跟踪器中找不到任何相关问题,您可能需要报告此问题。
  • @JimFasarakisHilliard。我还不习惯这是一个 PyCharm 问题。我去了 PEP 484/526 看看是否有一个 Null 可以以与 None 相同的方式使用。这将启用以下提示:labelframes: List[Union[ttk.LabelFrame, Null]] = [] 如果有类似的东西,我没有看到它。这意味着 PEP 中要么存在空白,要么(更有可能)我误解了 PEP。如果 PEP 未定义它,那么 PyCharm 和 mypy 都没有错。

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


【解决方案1】:

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

引自 PEP:

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

from typing import IO

stream = None  # type: IO[str]

类型检查器不应抱怨这一点(尽管值 None 与给定类型不匹配),也不应将推断类型更改为 Optional[...](尽管规则对默认值为没有 )。这里的假设是其他代码将确保给变量一个正确类型的值,并且所有使用都可以假设变量具有给定的类型。

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

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2010-10-10
    • 2020-10-24
    • 2013-01-22
    • 1970-01-01
    相关资源
    最近更新 更多