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

Python 3.12嵌套泛型定义与列表扁平化类型提示问题

实现支持类型提示的任意嵌套序列扁平化函数

我需要实现一个可以扁平化任意层数嵌套列表的函数,在Python 3.12中定义了嵌套泛型类型与flatten函数,但传入嵌套列表时,返回值的类型提示仍为原嵌套类型。修正Nested类型定义后,类型提示恢复正常,但bytes类型会被错误扁平化,处理str/bytes还会出现无限递归问题。尝试通过判断元素是否为T类型解决,但isinstance(item, T)无法直接生效,需要自定义泛型类型检查器。

期望实现效果:

  • 传入list[list[str]],返回list[str]
  • 传入list[list[bytes]],返回list[bytes]
  • 避免处理str/bytes时的无限递归问题

初始代码(存在类型提示异常)

T = TypeVar("T")
type Nested[T] = Sequence[T | Sequence[Nested]]

def flatten(seq: Nested[T]) -> list[T]:
    flattened: list[T] = []
    for elem in seq:
        if isinstance(item, Sequence):
            flattened.extend(flatten(cast(Nested[T], elem)))
        else:
            flattened.append(elem)
    return flattened

修正类型定义后的代码(解决类型提示,但引入bytes/str问题)

T = TypeVar("T")
type Nested[T] = Sequence[T | Nested[T]] # <--- 此处修正!!

def flatten(seq: Nested[T]) -> list[T]:
    flattened: list[T] = []
    for elem in seq:
        if isinstance(item, Sequence):
            flattened.extend(flatten(cast(Nested[T], elem)))
        else:
            flattened.append(elem)
    return flattened

尝试修改判断逻辑的代码(isinstance(item, T)不生效)

T = TypeVar("T")
type Nested[T] = Sequence[T | Nested[T]]

def flatten(seq: Nested[T]) -> list[T]:
    flattened: list[T] = []
    for elem in seq:
        if isinstance(item, T): # <-- 这里无效,需要自定义泛型类型检查器
            flattened.append(elem)
        else:
            flattened.extend(flatten(elem))
    return flattened

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:34:58