gpt4 book ai didi

python - 为什么 PyCharm 不捕获 Optional[int] 和 Optional[str] 之间的类型错误?

转载 作者:行者123 更新时间:2023-12-05 05:15:59 26 4
gpt4 key购买 nike

我有点困惑为什么 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)

请注意 funci 中的 funcs 调用没有发现将 Optional[int] 传递给正在寻找 Optional[ 的函数的问题str].

enter image description here

然而,如果我们删除 Optional[str],检查就会出现。

enter image description here

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

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

最佳答案

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

Is this expected behavior?

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

让我们使用 Mypy static type checker因为它的结果通常更准确。

以下内容:

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]"

If yes, what can I do about it?

Python 使用 gradual typing这意味着随着代码的进行,可以检查类型,从而逐渐提示其正确性。

如果您明确检查类型:

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

Mypy 静态类型检查器没有发出错误。另一种方法是使用 cast如果您确定在调用 funcs(var) 的行之前该值将被限制为 None

关于python - 为什么 PyCharm 不捕获 Optional[int] 和 Optional[str] 之间的类型错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50955005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com