从用mypy注释的Python函数返回None,多个返回类型

30

我来自Typescript背景。我正在将静态类型检查引入我正在工作的Python项目中(使用mypy)。

在Typescript中,从被注释为返回其他内容(例如字符串)的函数中返回null是有效的:

function test(flag: boolean): string {
    if(flag) {
        return 'success';
    } else {
        return null;
    }
}

您可以为函数添加多个可能的返回类型的注释,例如字符串或布尔值:

function test(flag: boolean): string | boolean {
    if(flag) {
        return 'success';
    } else {
        return false;
    }
}

但是,在使用mypy的Python中,如果函数被注释为返回str,那么我将不允许从该函数返回None。

def test(flag: bool) -> str:
    if flag:
        return 'success'
    else:
        return None
        # [mypy] error:Incompatible return value type (got "None", expected "str")

此外,我没有看到可以注释多个返回类型的方法,例如 str | None

在使用mypy时,我该如何处理类似这样的情况?我的代码库中到处都是从错误状态返回 None 的函数。


你能否只返回一个空字符串呢? - K-Log
很合乎逻辑:在Python中,None并不是真正的“null引用”,它是一个对象(就像任何其他对象一样),其类型是NoneType - Willem Van Onsem
@WillemVanOnsem 是的,在Python中,None类型与JavaScript中的null引用是不同的,这是有道理的。 - Corey Cole
1个回答

48

好的,我在 mypy gitter 上得到了 @zsol 的帮助,找到了文档中缺失的部分!

两个有用的 mypy 特性是 Optional 和 Union 类型,可以从 Python 的 typing 模块中导入。 相关文档请点击此处。

如果您想注释函数可能返回除主类型(例如 str)外的 None,请使用 Optional

from typing import Optional

def test(flag: bool) -> Optional[str]:
    if flag:
        return 'success'
    else:
        return None

如果您想注释该函数可能返回多种类型,例如str | bool,请使用Union

from typing import Union

def test(flag: bool) -> Union[str, bool]:
    if flag:
        return 'success'
    else:
        return False

1
您还可以使用no_strict_optional = True(或在命令行中使用--no-strict-optional)来允许接受任何预期类型的None - Sylvain

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