Python void 返回类型注解

Posted

技术标签:

【中文标题】Python void 返回类型注解【英文标题】:Python void return type annotation 【发布时间】:2016-08-16 06:55:46 【问题描述】:

在python 3.x中,常用函数的返回类型注解,如:

def foo() -> str:
    return "bar"

“void”类型的正确注解是什么?

我正在考虑 3 个选项:

    def foo() -> None: 不是逻辑 IMO,因为 None 不是类型, def foo() -> type(None): 使用我知道的最佳语法来获取NoneTypedef foo(): 省略显式返回类型信息。

选项 2. 对我来说似乎最合乎逻辑,但我已经看到了一些 1 的实例。

【问题讨论】:

FWIW,Python 没有 void 返回类型的函数。任何没有显式 return 的函数(或函数中的分支)都将返回 None。我假设 OP 明白,此评论主要是为了未来读者的利益...... 嗯,这个问题不像“为什么我的函数在 Python 中返回 None?”那么受欢迎。 (我提出了这个问题),所以可能大多数读者已经知道默认行为。 1 vs 2的困境在答案中得到解决。但是3呢?对于“程序”,我实际上更喜欢选项 3,没有无用的混乱(毕竟,这个函数不返回任何东西)。 @TomaszGandor 同意。当函数或方法不包含 return 语句时,无需指定其返回类型。 【参考方案1】:

这直接来自PEP 484 -- Type Hints 文档:

在类型提示中使用时,表达式None 被认为等同于type(None)

而且,如您所见,大多数示例都使用 None 作为返回类型。

【讨论】:

为了澄清,请选择上面的选项 1。 NoReturn 类型 python.org/dev/peps/pep-0484/#the-noreturn-type 怎么样? @asmaier 根据this question 引用PEP 484 — Type Hints NoReturn 类型用于“...注释永远不会正常返回的函数。例如,无条件引发异常的函数.. 。” 补充一点——有一个类 NoneType 与 None 不同。 (无!= 类型(无))。如果您正在检查带有 -> None 输入提示的函数的返回类型。你想检查是否 typing.get_type_hints(func)['return'] == type(None)【参考方案2】:

TLDR:void 返回类型注释的惯用等效项是 -> None

def foo() -> None:
    ...

这匹配一个没有return 或只有一个return 的函数计算为None

def void_func():  # unannotated void function
    pass

print(void_func())  # None

省略返回类型 not 表示没有返回值。根据PEP 484:

对于检查函数,参数和返回类型的默认注释是Any

这意味着该值被视为动态类型和静态supports any operation。这实际上与void 的含义相反。


Python 中的类型提示并不严格要求实际类型。例如,注解可以使用类型名称的字符串:Union[str, int]Union[str, 'int']'Union[str, int]',各种变体都是等效的。

类似地,类型注释None 被认为意味着“属于NoneType”。这可以用于其他情况以及返回类型,尽管您最常将其视为返回类型注释:

bar : None

def foo(baz: None) -> None:
    return None

这也适用于泛型类型。例如,您可以在Generator[int, None, None] 中使用None 来指示生成器不接受或不返回值。


尽管 PEP 484 建议 None 表示 type(None),您不应该明确使用后一种形式。类型提示规范包括任何形式的type(...)。这在技术上是一个运行时表达式,它的支持完全取决于类型检查器。 mypy 项目是 considering whether to remove support for type(None) 并将其从 484 中删除。

或者也许我们应该更新 PEP 484 以不建议 type(None) 作为类型有效,而 None 是唯一正确的拼写?应该有一种——最好只有一种——明显的方法等等。

--- JukkaL, 18 May 2018

【讨论】:

以上是关于Python void 返回类型注解的主要内容,如果未能解决你的问题,请参考以下文章

Python类型注解:继承方法的返回类型

Python类型注解

Python方法和返回值(Union)联合类型注解

python类型注解

Python 3.5 类型注解

基于 Python 3 新增的函数注解(Function Annotations )语法实现参数类型检查功能