[英]Type-hint different number of return values with python mypy
我想知道如何键入以下内容:
from typing import Any, Union, Dict, Tuple
# here x is
def f(x : str) -> Union[Tuple[int, bool], Tuple[int, str, float]]:
if 'something' in x:
return 1, 'this', 3.0
return 1, True
a,b = f(x = 'this is something')
x,y,z = f(x = 'this is')
这会引发错误:
main.py:9: error: Too many values to unpack (2 expected, 3 provided)
main.py:10: error: Need more than 2 values to unpack (3 expected)
所以问题很清楚——我有一个方法可以返回两组不同的值,但是预期的解决方案( Union
)没有像我预期的那样工作。
如果 function 总是返回一个int
元组,你可以试试这个解决方案:
def f() -> tuple[int, ...]:
tuple[int,...]
类型表示这个 function 将返回一个仅包含整数的tuple
。
从错误消息中猜测:您正在使用 mypy. 此 static 类型检查器无法根据函数的 arguments 确定返回类型。
在您的示例中,您需要知道返回类型应该是两种可能性中的哪一种,以便您可以使用两种解决方案之一:
(变化的)问题中返回变量的常量:
CASE2 = 'this is something'
FReturn2 = Tuple[int, bool]
CASE3 = 'this is'
FReturn3 = Tuple[int, str, float]
f_return = f(x=CASE2)
assert len(f_return) == 2
a, b = f_return
f_return = f(x=CASE3)
assert len(f_return) == 3
x, y, z = f_return
Assert 在运行时检查长度,并在不同时选择性地抛出 Assertion Error 和您的错误消息。
a, b = cast(FReturn2, f(x=CASE2))
x, y, z = cast(FReturn3, f(x=CASE3))
Cast 不会改变运行时行为。 赋值语句将失败,则元组元素的数量将与左侧不匹配。 当然你可以直接指定复杂类型,类型变量是为了适应不断变化的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.