具有两个或多个返回参数的函数注释

Posted

技术标签:

【中文标题】具有两个或多个返回参数的函数注释【英文标题】:Function annotation with two or more return parameters 【发布时间】:2019-09-24 15:24:39 【问题描述】:

当我为返回一个参数的函数编写注释时,我没有问题。

def func() -> str:
    return "ok"

但是,当我编写带有两个或更多参数的注释时,我的 PyCharm 给了我SyntaxError: invalid syntax

def func() -> str, str:
    return "ok - 1", "ok - 2"

我认为参数可以与tuple 组合,但我认为这不是最好的方法。

我的问题是:如何正确地注释具有两个或多个返回参数的函数?

请在您的回复中包含 PEP 链接(如果有)。我在PEP 484 和PEP 3107 寻找答案,但找不到。

【问题讨论】:

应该注意的是,第二个func 等价于tmp = ('ok - 1', 'ok - 2') return tmp,这使得它为什么需要元组立即显而易见。 python.org/dev/peps/pep-3107/#parameters How to annotate types of multiple return values?的可能重复 【参考方案1】:

使用typing.Tuple:

from typing import Tuple

def func() -> Tuple[str, str]:
    return 'a', 'b'

这是合适的,因为从概念上讲,您实际上是返回一个包含这些值的 tuple。注意:

print(type(func()))

输出:

<class 'tuple'>

除了空的tuple (()),parentheses are not necessary to define a tuple,这意味着'a', 'b' 被创建为tuple,而不是被return 语句收集到一个单独的值。

【讨论】:

Tuple 是合理的。 in some cases 可能过于严格,但据我所知,如果没有不同的权衡,没有更好的选择。 @kojiro 在我看来,这不适用于返回值...? 我认为它仍然适用。签名的主要内容不是函数本身返回一个元组,而是它返回一个具有特定长度的 unpackable。有很多序列类型是不可打包的,但没有通用的不可打包类型也有长度和内部类型说明符。元组可以指定所有内容,但过于严格。 @kojiro 我可能会误会你,但是具有多个返回值的函数特别地返回tuple,而不是具有单个返回值的函数值也恰好是一个知道其长度和元素类型的不可打包对象,需要这样的说明符吗? 元组仍然是一个碰巧不可打包的对象。这就是我要说的。没有办法表示 python 从函数返回多个值,因为 python 不能从函数返回多个值。但它可以返回一个序列,元组是一种序列。

以上是关于具有两个或多个返回参数的函数注释的主要内容,如果未能解决你的问题,请参考以下文章

返回具有多个输入参数的函数的值以在同一类中具有多个参数的另一个函数中使用?

从具有多个参数C#的PageMethods返回值后不调用成功函数

使用 PyQt5“更新”从具有多个参数的函数中销毁返回值 [关闭]

如何注释返回类型取决于其参数的函数?

具有多个参数的 PySpark UDF 返回 null

数组对象的21种常用方法