2

我有点困惑为什么 PyCharm 不区分两种不同的 Optional 类型。

考虑以下代码。

def funcs(foo:Optional[str]=None):
    print(foo)

def funci(var:Optional[int]=None):
    funcs(var)

argi = 1
args = "something"
argn = None

funcs(argi)
funcs(args)
funcs(argn)

请注意,funcs内部调用funci没有发现将 Optional[int] 传递给正在寻找Optional[str].

在此处输入图像描述

然而,如果我们去掉Optional[str]检查树皮。

在此处输入图像描述

这是预期的行为吗?如果是,我该怎么办?

我的直觉说类型检查应该足够聪明,可以区分Optional[str]vs Optional[int]。我已通读PEP-526PEP-484无济于事。

4

1 回答 1

1

如果您在当前版本的 PyCharm (2021.1) 中使用默认检查设置对此进行测试,则不再发出删除参数中的Optional类型提示后的第二个警告。funcs

这是预期的行为吗?

是的,linter 是(曾经)正确的。类型必须完全兼容,否则可能会出现潜在错误,linter 是正确的警告你。在更严格的意义上,PyCharm 也应该在第一种情况下发出警告,因为 和 之间可能不str兼容int

让我们使用Mypy 静态类型检查器,因为它的结果通常更准确。

以下:

def funcs(foo: Optional[str] = None):
    pass

def funci(var: Optional[int] = None):
    funcs(var)

会导致 Mypy 发出错误:

your_module.py: error: Argument 1 to "funcs" has incompatible type "Optional[int]"; expected "Optional[str]"

如果是,我该怎么办?

Python 使用逐渐键入的含义,因为代码可以检查类型,从而逐渐提示正确性。

如果您明确检查类型:

def funci(var: Optional[int] = None):
    if var is None:
        funcs(var)

Mypy 静态类型检查器没有错误。如果您确定该值将cast被限制None在调用funcs(var).

于 2021-04-22T12:17:46.793 回答