Python 类型提示 - NoReturn 的意义何在?

663 阅读1分钟

有时函数从不返回,例如总是引发异常。对于这种函数的返回类型,我们可以 "逃脱 "使用None ,但最好使用特殊的NoReturn 类型)。这使得Mypy能够更好地发现不可达的代码(如前面所涉及的)。它也向未来的读者表明,不返回是故意的。

例如,以这段代码为例。

def always_raise() -> None:
    raise RuntimeError("Uh oh")


def main() -> None:
    always_raise()
    print("Ok!")

调用always_raise() 意味着我们会有一个RuntimeError ,而print("Ok!") 无法到达。但如果我们用Mypy检查,它无法检测到这一点。

$ mypy --warn-unreachable example.py
Success: no issues found in 1 source file

让我们更新代码,改为使用NoReturn

from typing import NoReturn


def always_raise() -> NoReturn:
    raise RuntimeError("Uh oh")


def main() -> None:
    always_raise()
    print("Ok!")

现在Mypy告诉我们,print() 将永远不会运行。

$ mypy --warn-unreachable example.py
example.py:10: error: Statement is unreachable
Found 1 error in 1 file (checked 1 source file)

太好了!

对于任何永不返回的函数,最好使用NoReturn 。这包括具有无限循环的函数或使用操作系统的API来结束进程。

import os
from typing import NoReturn


def loop_forever() -> NoReturn:
    while True:
        ...  # loop never exits with 'break'


def abruptly_die() -> NoReturn:
    os._exit(123)