Python函数返回多个不同类型返回值时的正确箭头类型注解写法
Python函数返回多个不同类型返回值时的正确箭头类型注解写法
你遇到的问题其实是对Python返回值和类型注解的本质理解有点偏差——Python里函数返回多个值的时候,本质上是返回一个元组,所以你的返回类型注解不能直接用逗号分隔两个列表类型,得把它们包裹在元组类型里才行。
正确的写法示例
首先要确保你导入了需要的类型提示工具,根据Python版本不同写法略有区别:
情况1:Python 3.10及以上版本(支持PEP 604的|语法)
可以直接用内置的list、tuple,并用|代替Union:
def split_x_and_y(data_packet) -> tuple[list[float], list[float | str]]: # 你的业务逻辑 x_values = data_packet.x # list[float]类型 y_values = data_packet.y # list[float | str]类型 # 其他逻辑 return x_values, y_values
情况2:Python 3.9及以下版本
需要从typing模块导入List、Tuple、Union:
from typing import List, Tuple, Union def split_x_and_y(data_packet) -> Tuple[List[float], List[Union[float, str]]]: # 你的业务逻辑 x_values = data_packet.x # List[float]类型 y_values = data_packet.y # List[Union[float, str]]类型 # 其他逻辑 return x_values, y_values
为什么原来的写法会报错?
你之前用逗号直接分隔两个返回类型-> list[float], list[Union[float, str]],Python解释器会把它当成函数的多个返回类型注解,但Python的语法里函数只能有一个返回类型注解,这个注解需要准确描述返回值的实际类型——而你返回的x_values, y_values在Python里是一个包含两个元素的元组,所以必须用tuple(或Tuple)来包裹这两个元素的类型。
扩展到返回更多值的情况
如果你的函数需要返回3个、4个不同类型的值,只需要在tuple里依次添加对应的类型即可:
比如返回3个值的情况:
# Python 3.10+ def return_multiple() -> tuple[int, str, list[bool]]: return 1, "hello", [True, False] # Python 3.9及以下 from typing import Tuple, List def return_multiple() -> Tuple[int, str, List[bool]]: return 1, "hello", [True, False]
关于Union的疑问
你说得没错,Union确实不是这里的解决方案——Union是用来表示单个值可能是多种类型之一,而你的场景是返回两个独立的、类型不同的列表,所以用元组来描述这个返回值的结构才是正确的选择,这也和你调用时用my_x, my_y = split_x_and_y(data_packet)的解构逻辑完全匹配。
备注:内容来源于stack exchange,提问作者Gn0my
相关产品推荐
相关产品推荐

