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):
使用我知道的最佳语法来获取NoneType
,
def 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 HintsNoReturn
类型用于“...注释永远不会正常返回的函数。例如,无条件引发异常的函数.. 。”
补充一点——有一个类 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 返回类型注解的主要内容,如果未能解决你的问题,请参考以下文章