【问题标题】: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 有什么具体原因吗?

标签: python type-hinting


【解决方案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]]之类的东西,要么写多个函数,以后处理起来会容易得多。

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

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

【讨论】:

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