You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何针对Python中复杂return语句正确编写返回类型?

正确的返回类型推导及写法

我们一步步拆解代码的类型结构:

  • lines.values()的类型:Iterable[List[Tuple[int, graphanno.Node]]],每个元素是包含(int, Node)元组的列表。
  • 生成器(zip(*line) for line in lines.values()):对每个line执行zip(*line),会把line中所有元组的第一个元素打包成一个int元组,第二个元素打包成一个Node元组,因此每个生成器元素的类型是Tuple[Tuple[int, ...], Tuple[graphanno.Node, ...]]。
  • zip(*生成器)的类型:解包生成器后传入zip,会把所有生成器元素的第一个部分(int元组)打包成一个大元组,第二个部分(Node元组)打包成另一个大元组,结果是包含两个元素的可迭代对象,每个元素是由多个int元组/Node元组组成的元组。
  • 转成tuple并排序后:tuple(sorted(...))最终得到的是一个元组,内部包含两个元素(顺序由排序key决定),每个元素的类型分别是Tuple[Tuple[int, ...], ...]和Tuple[Tuple[graphanno.Node, ...], ...]。

最终正确的返回类型写法

如果不需要严格区分排序后的元素顺序,可以写成:

from typing import Tuple, Union
import graphanno

# 简写Node类型
Node = graphanno.Node

def your_function(lines: dict[tuple[int, Node], list[tuple[int, Node]]]) -> Tuple[Union[Tuple[Tuple[int, ...], ...], Tuple[Tuple[Node, ...], ...]], ...]:
    # 函数实现
    return tuple(sorted(
        tuple(zip(*(zip(*line) for line in lines.values()))),
        key=_get_line_origin_x,
    ))

如果想更精确表达原始结构(排序仅改变顺序,元素类型固定为两种),也可以写成:

Tuple[Tuple[Tuple[int, ...], ...] | Tuple[Tuple[Node, ...], ...], Tuple[Tuple[int, ...], ...] | Tuple[Tuple[Node, ...], ...]]

为什么你的原写法不正确

你写的Tuple[Sequence[Tuple[int, Node]], ...]不符合实际返回结构:返回的嵌套结构中,并没有直接的Sequence[Tuple[int, Node]]元素,而是由多层元组嵌套而成——最外层元组的元素是「由多个int元组组成的元组」或「由多个Node元组组成的元组」,而非直接包含(int, Node)的序列。

内容的提问来源于stack exchange,提问作者aarya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:45:44