如何输入提示函数的可选返回参数?

Raf*_*Raf 7 python type-hinting

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

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
Run Code Online (Sandbox Code Playgroud)

- - 编辑

这似乎有效:
-> Tuple[float, Union[None, float]] :
Run Code Online (Sandbox Code Playgroud)

但这太丑陋了,似乎掩盖了一个事实,即通常它只会返回一个简单的浮点数。这是正确的方法吗?

正确的方法请参阅下面的答案。

---编辑2

此问题被标记为该问题的重复项。然而,那个问题是关于Union返回类型的,而这个问题是关于Optional返回类型的。


注意:这种设计不是一个好的实践,应该避免,以支持一致的返回类型。尽管如此,如果必须这样做,可选输出参数意味着根据输入参数的标志可能不会返回的参数。

Rob*_*rcd 6

Python 3.10PEP 604开始,您现在可以|使用Union.

返回类型将是float | Tuple[float, float]


正确的类型提示是:

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
Run Code Online (Sandbox Code Playgroud)

然而,获得此类回报通常不是一个好的做法。要么返回类似的东西Tuple[float, Optional[float]],要么写多个函数,以后处理起来会容易很多。

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

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