PyCharm 类型检查无法按预期工作

Posted

技术标签:

【中文标题】PyCharm 类型检查无法按预期工作【英文标题】:PyCharm type checking doesn't work as expected 【发布时间】:2018-09-23 15:32:42 【问题描述】:

编辑

根据@Jim Fasarakis Hilliard 的回答,我知道这不是错误,而是预期的行为。所以,我想补充一个问题——我可以在PyCharm 的类型检查器中以某种方式强制mypys --strict-optional 类似功能吗?


看了几个关于Python 3.5+Pycharm 类型检查的视频后,我认为这应该被标记为错误的返回类型:

from typing import Optional, List
import random

def r() -> Optional[List[int]]:
    if random.choice([0, 1]):
        return [1, 2, 3]
    return None


def f() -> List[int]:
    return r()

f() 函数可以返回 listints 或 None,这是明确指定的,但 PyCharm 不会将 return r() 标记为错误返回。

def f() -> List[int]:
    return None

例如,如果f() 函数如上所示,PyCharm 检测到有错误的return 类型。

这是一个错误还是我应该更改一些设置?我将类型检查的严重性提高到error

【问题讨论】:

【参考方案1】:

PyCharm 的类型检查器可能对None 的处理方式与mypy 相同,请参阅:The type of None and optional types(至少在这种情况下是这样做的。)

这与以下函数类型同时检查 mypy (0.580) 和 PyCharm (build 173.4301.16) 的原因相同:

def foo(x: Optional[int]) -> int:
    return x + 2

可以称之为错误吗?无论哪种方式,mypy 都提供了 --strict-optional 标志来处理这些问题,并且在使用时会捕获您的原始错误:

error: Incompatible return value type (got "Optional[List[int]]", expected "List[int]")

根据 mypy 的文档,该标志将在未来的版本中默认使用。尽管我在他们的documentation on Type Hints 中找不到任何相关信息,但我可以放心地假设 PyCharm 会在某个时候效仿。

【讨论】:

谢谢,所以 PyCharm 中还没有这样的选项吗?这对我来说比 mypy 舒服多了。 @MilanoSlesarik 我明白了。不幸的是,我似乎找不到有关 PyCharm 类型检查器的文档,所以我不确定它可能暴露的任何特殊标志。 这个问题在 PyCharm 的 PY-24834 下跟踪

以上是关于PyCharm 类型检查无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

函数 .contains() 在 Groovy 中无法按预期方式工作

带有操作块的 NSOperationQueue 在 SWIFT 中无法按预期工作

Angular 4 加载器无法按预期工作

使用 Postman 时 django-cors-header 无法按预期工作

ASP.NET 核心模型验证无法按预期工作

Java contains 无法按预期工作,因为 "someString" != "someString"