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

如何为固定返回T与Node[T]的Iterator添加精准类型注解?

解决Node类迭代器解构赋值的类型注解问题

你的问题在于原有的Iterator[Union[T, Node[T]]]类型注解无法让类型检查器识别迭代元素的固定顺序和数量,导致解构后必须手动收窄类型。要解决这个问题,我们可以让Node类实现序列协议,并通过重载__getitem__来明确不同索引对应的返回类型,这样类型检查器就能自动推断解构赋值后的变量类型。

修改后的代码

from __future__ import annotations
import typing
from typing import overload, Generic, Optional, Iterator, Union, Literal

class Node(Generic[T]):
    def __init__(self, value: T, next: Optional[Node[T]] = None) -> None:
        self.value = value 
        self.next = next

    # 重载__getitem__,明确索引0返回T类型,索引1返回Optional[Node[T]]类型
    @overload
    def __getitem__(self, index: Literal[0]) -> T: ...
    @overload
    def __getitem__(self, index: Literal[1]) -> Optional[Node[T]]: ...
    def __getitem__(self, index: int) -> Union[T, Optional[Node[T]]]:
        if index == 0:
            return self.value
        elif index == 1:
            return self.next
        else:
            raise IndexError("Node实例仅包含2个可解构元素")

    # 实现__len__,告诉类型检查器这是长度为2的序列
    def __len__(self) -> int:
        return 2

    # 保持原有的迭代逻辑即可
    def __iter__(self) -> Iterator[Union[T, Optional[Node[T]]]]:
        yield from (self.value, self.next)

使用效果

现在解构赋值时,类型检查器会自动推断变量类型,无需手动收窄:

one = Node[int](1, Node[int](2))
value, next_node = one  # value被推断为int,next_node被推断为Optional[Node[int]]

# 直接赋值不会触发类型错误(若next_node不为None)
if next_node is not None:
    two: Node[int] = next_node

原理说明

通过实现__len__和重载的__getitem__,我们向类型检查器传递了两个关键信息:

  1. Node实例是一个长度固定为2的序列;
  2. 索引0对应的值是T类型,索引1对应的值是Optional[Node[T]]类型。

类型检查器会利用这些信息,在解构赋值时自动匹配每个变量的类型,避免了Union类型带来的歧义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:15:35