返回 None 和 string 的函数的 mypy 类型提示

问题描述 投票:0回答:1

我有两个这样的功能。我如何输入提示

func()
,这样 mypy 就不会引发错误?

现在它说

test.py:14: error: Argument 1 to "len" has incompatible type "str | None"; expected "Sized"  [arg-type]
from typing import Optional

path = "path"

def func(path: str) -> Optional[str]:
    s = "foo"
    if True:
        return s
    return None

def func2() -> None:
    if func(path) is not None:
        if len(func(path)) > 0:
            print("Yes")
        else:
            print("No") 

我尝试了

Optional[str]
Union
,但似乎都不起作用。

python mypy
1个回答
1
投票

mypy 无法知道两次调用

func
会产生相同的结果。因此它无法知道如果第一次
func(path) is not None
,第二次
func(path)
被称为返回值是
None
是不可能的。 mypy 在这个保守的假设中是正确的。

您可以将返回值绑定到变量,这允许 mypy 跨类型缩小if推理该变量

的可能类型。

def func2() -> None: foo = func(path) # `foo` can only be `None` or a `str`; but `foo` in `len(foo)` can't be None. if foo is not None and len(foo) > 0: print("Yes") return print("No")
    
© www.soinside.com 2019 - 2024. All rights reserved.