如何键入提示函数的可选返回参数? [复制]
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 RecommendationsWhy should functions return values of a consistent type?在返回语句中保持一致。函数中的所有 return 语句都应该返回一个表达式,或者它们都不应该返回。如果任何 return 语句返回一个表达式,则任何没有返回值的 return 语句都应将其显式声明为 return None,并且显式的 return 语句应出现在函数的末尾(如果可访问)。
【讨论】:
谢谢。我的真实案例是一个更复杂的函数求根算法。返回值是根。根据要求,它可以返回所有交互的收敛统计数据和参数。我可能会考虑总是重新调整一个元组。但在 99% 的情况下,我对是否必须处理额外返回的参数犹豫不决。为什么当前的设计是一种不好的做法,有什么具体的论据? 我已经用 PEP8/SO 参考编辑了答案mypy
不能为return_y
假定特定值,并且会将a, b = myfunc(3.14, x)
之类的内容标记为错误,无论x
是True
还是False
。跨度>
@RobinFrcd 感谢您添加参考。虽然我现在找不到它们,但我记得 SciPy 或 NumPy 中的一些函数可以根据用户的标志选择性地更改它们返回的内容。无论如何,现在确信,我决定总是返回元组,并编写一个包装函数来只获取根。以上是关于如何键入提示函数的可选返回参数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章