繁体   English   中英

类型提示不同数量的返回值与 python mypy

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM