Python void返回类型注释


108

在python 3.x中,通常使用函数的返回类型注释,例如:

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

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

我正在考虑3个选择:

  1. def foo() -> None:
    • 不是逻辑IMO,因为None不是类型,
  2. def foo() -> type(None):
    • 使用我知道的最佳语法NoneType
  3. def foo():
    • 省略显式的返回类型信息。

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


11
FWIW,Python没有带有void返回类型的函数。没有显式的任何函数(或函数中的分支)return将返回None。我认为OP知道,此评论主要是为将来的读者造福...
PM 2Ring 2016年

好吧,这个问题并不像“为什么我的函数在Python中返回None?”那样受欢迎。(我提出了这个问题),所以可能大多数读者已经知道默认行为。在答案中解决了难题1 vs 2。但是3呢?对于“过程”,我实际上更喜欢选项3,而不会造成混乱(毕竟,此函数不会返回任何内容)。
Tomasz Gandor

@TomaszGandor同意。当函数或方法不包含return语句时,无需指定其返回类型。
Jeyekomon

Answers:


121

这直接来自PEP 484-类型提示文档:

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

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


22
为了明确起见,请选择上面的选项1。
亚当·尼尔森


12
根据@asmaier 这个问题,该报告引用PEP 484 -类型提示 NoReturn类型用于“...注释功能,从来没有正常返回。例如,一个函数,无条件地抛出一个异常...”
罗德里戈·拉古那

37

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

def foo() -> None:
    ...

这符合,如果没有一个函数return或只是一个光秃秃return的计算结果为None

def void_func():  # unannotated void function
    pass

print(void())  # None

省略返回类型也并不意味着就没有返回值。根据PEP 484

对于选中的函数,参数和返回类型的默认注释为Any

这意味着该值被认为是动态类型的,并且静态地支持任何操作。这实际上是的相反含义void


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

同样,类型注释None被认为 “ is of NoneType”。这不仅可以用于返回类型,尽管您会经常在以下位置看到它:

bar : None

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

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


即使PEP 484建议采用这种None方式type(None),您也不应明确使用后者。该类型提示规范并没有包括任何形式的type(...)。从技术上讲,这是一个运行时表达式,其支持完全取决于类型检查器。该mypy项目正在考虑取消type(None)484的支持并将其也从484中删除。

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

--- JukkaL,2018年5月18日


4
巨大的喊叫声解释了为什么第三个选项实际上根本不是void函数。
никта
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.