如何键入提示函数的可选返回参数? [复制]

Posted

技术标签:

【中文标题】如何键入提示函数的可选返回参数? [复制]【英文标题】:How to type hint a function's optional return parameter? [duplicate] 【发布时间】:2021-01-11 03:17:35 【问题描述】:

如何键入提示可选的输出参数:

def myfunc(
        x: float, 
        return_y: bool = False
        ) -> float, Optional[float] : # !!! WRONG !!!

    # ... code here
    #
    # y and z are floats

    if return_y:
        return z, y

    return z

--- 编辑

这似乎有效:
-> Tuple[float, Union[None, float]] :

但这太难看了,似乎压倒了通常它只会返回一个简单的浮点数的事实。 这是正确的方法吗?

正确方法见下方答案。


注意:这种设计不是一个好的做法,应该避免使用一致的返回类型。尽管如此,如果必须这样做,可选输出参数表示可能不会根据输入参数的标志返回的参数。

【问题讨论】:

你的函数要么返回一个浮点数,要么返回一个由两个浮点数组成的元组。所以:-> Union[float, Tuple[float, float]]。您给出的建议是错误的,因为在单参数情况下,您根本不返回 Tuple 不要让函数的返回类型依赖于运行时参数。要么总是返回一个元组,让用户决定是否要忽略第二个元素,要么定义两个函数。 @chepner 有什么具体原因吗? 【参考方案1】:

正确的类型提示是:

from typing import Tuple, Union


def myfunc(x: float, return_y: bool = False) -> Union[float, Tuple[float, float]]:
    z = 1.5

    if return_y:
        y = 2.0
        return z, y

    return z

但是,获得此类回报通常不是一个好习惯。要么返回Tuple[float, Optional[float]]之类的东西,要么写多个函数,以后处理起来会容易得多。

关于返回语句一致性的更多信息:

PEP8 - Programming Recommendations

在返回语句中保持一致。函数中的所有 return 语句都应该返回一个表达式,或者它们都不应该返回。如果任何 return 语句返回一个表达式,则任何没有返回值的 return 语句都应将其显式声明为 return None,并且显式的 return 语句应出现在函数的末尾(如果可访问)。

Why should functions return values of a consistent type?

【讨论】:

谢谢。我的真实案例是一个更复杂的函数求根算法。返回值是根。根据要求,它可以返回所有交互的收敛统计数据和参数。我可能会考虑总是重新调整一个元组。但在 99% 的情况下,我对是否必须处理额外返回的参数犹豫不决。为什么当前的设计是一种不好的做法,有什么具体的论据? 我已经用 PEP8/SO 参考编辑了答案 mypy 不能为return_y 假定特定值,并且会将a, b = myfunc(3.14, x) 之类的内容标记为错误,无论xTrue 还是False。跨度> @RobinFrcd 感谢您添加参考。虽然我现在找不到它们,但我记得 SciPy 或 NumPy 中的一些函数可以根据用户的标志选择性地更改它们返回的内容。无论如何,现在确信,我决定总是返回元组,并编写一个包装函数来只获取根。

以上是关于如何键入提示函数的可选返回参数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何存储和使用接受引用并返回未来的可选闭包?

如何匹配url中的可选参数? [复制]

如何键入提示 Python 函数返回从超类派生的任何类的实例?

C++ - 通过引用的可选参数

Angular如何传递跳过一些[重复]的可选构造函数参数

Go中的make函数如何处理可选参数? [复制]