PyCharm类型检查未按预期工作

3

编辑

根据@Jim Fasarakis Hilliard的回答,我理解这不是一个 bug,而是预期行为。所以,我想要补充问题 - 我是否可以在PyCharm的类型检查器中强制实现mypy--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()

enter image description here

f()函数可以返回int列表或显式指定的None,但PyCharm不会将return r()标记为错误返回。

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

enter image description here

例如,如果f()函数看起来像上面那样,PyCharm检测到有错误的return类型。
这是一个错误还是我需要改变一些设置?我将类型检查的严重程度增加到error
1个回答

6

PyCharm的类型检查器可能与mypy处理None的方式相同,参见:None的类型和可选类型(至少在此情况下是这样。)

这也是为什么以下函数在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的文档,这个标记将在未来的版本中默认使用。我认为PyCharm也会在某个时候跟随这个标准,尽管我在他们的类型提示文档documentation on Type Hints中找不到任何相关信息。

1
谢谢,所以PyCharm目前还没有这样的选项吗?对我来说比mypy更舒适。 - Milano
1
@MilanoSlesarik 我明白。不幸的是,我似乎找不到关于PyCharm类型检查器的文档,因此我不确定它可能会暴露出什么特殊标志。 - Dimitris Fasarakis Hilliard
1
此问题已在 PyCharm 的 PY-24834 中进行跟踪。 - ldrg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接