为什么PyCharm不能捕获可选[int]和可选[str]之间的类型错误?

2024-06-26 00:15:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

考虑下面的代码。

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调用没有发现将可选的[int]传递给正在查找Optional[str]的函数的问题

enter image description here

然而,如果我们去掉Optional[str],检查就会发出吠声

enter image description here

这是预期行为吗?如果是,我能做些什么

我的直觉告诉我,类型检查应该足够聪明,能够区分Optional[str]Optional[int]之间的区别。我通读了{a3}和{a4}都没有用


Tags: none类型foovardefargsoptionalpycharm
1条回答
网友
1楼 · 发布于 2024-06-26 00:15:44

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

Is this expected behavior?

是的,门楣是对的。一个类型必须是完全兼容的,否则可能会有潜在的错误,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静态类型检查器不会发出错误。另一种方法是使用^{},如果您确定在调用funcs(var)行之前,该值将被限制为None

相关问题 更多 >