修改
根据@Jim Fasarakis Hilliard的回答,我知道这不是一个错误,这是预期的行为。所以,我想添加一个问题 - 我可以以某种方式强制mypy
--strict-optional
- 类似PyCharm
类型检查器中的功能吗?
在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()
函数可以返回明确指定的list
int
或None
,但PyCharm
不会标记return r()
作为一个错误的回报。
def f() -> List[int]:
return None
例如,如果f()
函数如上所示,PyCharm
会检测到return
类型错误。
这是一个错误还是我应该更改一些设置?我将类型检查的严重性提高到error
。
答案 0 :(得分:4)
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
我猜可以称之为bug吗?无论哪种方式,mypy
都会提供--strict-optional
标记来处理这些问题,并在使用时捕获原始错误:
error: Incompatible return value type (got "Optional[List[int]]", expected "List[int]")
根据mypy的文档,默认情况下将在未来的版本中使用此标志。我会安全地假设PyCharm会在某些时候效仿,但我在documentation on Type Hints中找不到任何相关信息。