从用mypy注释的python函数返回None,多种返回类型

Posted

技术标签:

【中文标题】从用mypy注释的python函数返回None,多种返回类型【英文标题】:Return None from python function annotated with mypy, multiple return types 【发布时间】:2019-02-15 06:26:36 【问题描述】:

我来自 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 的函数遍布我的代码库。

【问题讨论】:

你能不能只返回一个空字符串? 这是合乎逻辑的:在 Python 中,None 不是一个“空引用”,它是一个对象(就像任何其他对象一样),它的类型是 NoneType @WillemVanOnsem 是的,python 中的 None 类型与 javascript 中的 null 引用不同。 【参考方案1】:

好的,感谢 mypy gitter 上的@zsol,我找到了文档中缺少的内容!

两个有用的 mypy 功能是可以从 python 的类型模块导入的 Optional 和 Union 类型。 Documentation here.

如果您想注释该函数除了主要类型之外还可能返回 None ,例如str,使用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

【讨论】:

以上是关于从用mypy注释的python函数返回None,多种返回类型的主要内容,如果未能解决你的问题,请参考以下文章

类方法返回实例的 MyPy 注释

检查 stdlib 函数时出现 Mypy 错误?

将 mypy 的通用 self 与 python2 类型注释一起使用

“void”函数中的NoReturn与None - 在Python 3.6中键入注释

“void”函数中的 NoReturn 与 None - Python 3.6 中的类型注释

类装饰器上的 Mypy 注释