PyCharm 类型检查没有按预期工作

PyCharm type checking doesn't work as expected

编辑

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


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

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() 函数可以 return intlist 或明确指定的 None,但 PyCharm 不将 return r() 标记为错误的 return。

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

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

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

PyCharm 的类型检查器可能以与 mypy 相同的方式处理 None,参见: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 会在某个时候效仿