有时函数从不返回,例如总是引发异常。对于这种函数的返回类型,我们可以 "逃脱 "使用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)