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
相关产品推荐
相关产品推荐

