键入一个函数永远不会返回的提示

Mar*_*ery 17 python type-hinting

Python的新类型提示功能允许我们输入函数返回的提示None...

def some_func() -> None:
    pass
Run Code Online (Sandbox Code Playgroud)

...或者保留未指定的返回类型,PEP规定应该使静态分析器假定任何返回类型都是可能的:

任何没有注释的函数都应该被视为具有最普遍的类型

但是,我应该如何键入一个函数永远不会返回的提示?例如,键入提示这两个函数的返回值的正确方法是什么?

def loop_forever():
    while True:
        print('This function never returns because it loops forever')

def always_explode():
    raise Exception('This function never returns because it always raises')
Run Code Online (Sandbox Code Playgroud)

-> None在这些情况下,指定或保留未指定的返回类型似乎都不正确.

Joe*_*ley 7

从 Python 3.11 开始,新的底部类型 typing.Never应该用于类型不返回的函数,如

from typing import Never

def always_explode() -> Never:
    raise
Run Code Online (Sandbox Code Playgroud)

这取代了typing.NoReturn

...使预期含义更加明确。

我猜测在某些时候它们会NoReturn在这种情况下被弃用,因为两者在 3.11 中都是有效的。

  • @MarkAmery,文档整体上相当不清楚,但对于“从不”,它明确表示 _This 可用于定义一个永远不应该被调用的函数,或者一个永远不会返回的函数:_ (3认同)
  • @MarkAmery 这很奇怪,因为 [PR](https://github.com/python/cpython/pull/30842) 和 [功能请求](https://bugs.python.org/issue46475) 都只谈论它作为底部类型。需要澄清 (3认同)
  • fwiw我认为拥有两个不同的事物具有一个含义只是消除了混乱。至少,我现在很困惑,但以前没有 (3认同)
  • 我认为您误解了文档。请注意`NoReturn`文档说:*“特殊类型表明函数永远不会返回。...`NoReturn`也可以用作底层类型**,一种没有值的类型。从Python 3.11开始, **对于这个概念**应该使用 Never 类型。"* - 强调我的。这些文档将不返回的函数和“底部类型”视为不同的“概念”,并表示您应该使用“Never”来表达底部类型的概念,而使用“NoReturn”来表达函数从不返回的概念。我不认为弃用是可能的! (2认同)

mis*_*ope 6

即使" PEP 484 - 类型提示 "标准提到了问题和答案,但没有人引用它的部分:涵盖您的问题NoReturn类型.

引用:

typing模块提供了一种特殊类型NoReturn来注释永远不会正常返回的函数.例如,一个无条件地引发异常的函数:

from typing import NoReturn

def stop() -> NoReturn:
    raise RuntimeError('no way')
Run Code Online (Sandbox Code Playgroud)

该部分还提供了错误用法的示例.虽然它不包含具有无限循环的函数,但在类型理论中它们同样满足永不返回由特殊类型表示的含义.

  • 当我在 2016 年 7 月提出这个问题时,Julian 和我没有注意到 PEP 484 中的“NoReturn”类型,这或许是情有可原的,因为它当时还不存在,并且直到[几乎一年后]才会添加到 PEP 中。 ](https://github.com/python/peps/commit/881c6bebdb79d3a51dea0a467e81abed410e5570)。尽管如此,是的,这看起来现在是正确的答案。 (3认同)
  • 哇!因此,对于今天的三年前的文档来说,该更新相当新鲜,但它缺少像 [PEP 0](https://www.python.org/dev/peps/) 中的“Last Modified”这样的标题。另外,现在它给了我一个提示,为什么我的 IDE 无法识别“打字”中的“NoReturn”类型,但在运行时却没有真正的问题。 (2认同)