PyCharm 类型检查没有按预期工作
PyCharm type checking doesn't work as expected
编辑
根据@Jim Fasarakis Hilliard 的回答,我知道这不是错误,而是预期的行为。所以,我想补充一个问题——我能否以某种方式在 PyCharm
的类型检查器中强制使用 mypy
s --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 int
的 list
或明确指定的 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 会在某个时候效仿
编辑
根据@Jim Fasarakis Hilliard 的回答,我知道这不是错误,而是预期的行为。所以,我想补充一个问题——我能否以某种方式在 PyCharm
的类型检查器中强制使用 mypy
s --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 int
的 list
或明确指定的 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 会在某个时候效仿