Mypy中如何标记元组剩余返回元素的类型为未知?
解决方案
1. 用Any兜底(最简单快速的方式)
如果不需要精确标注剩余元素的类型,只需要明确前两个元素的类型,可以直接用Tuple[int, str, Any, ...]。这里的...表示后续可以跟随任意数量的任意类型元素,完美适配父类返回值不确定的场景:
from typing import Tuple, Any def _parse(input_dict: dict) -> Tuple[int, str, Any, ...]: entity = 3 _id = "test" return (entity, _id, *super()._parse(input_dict))
2. 用Unpack拼接父类返回类型(精确且易维护)
如果想要更精确的类型标注,同时避免手动重复父类的返回类型定义,可以使用Unpack(Python 3.11内置,旧版本可通过typing_extensions.Unpack引入)结合ReturnType自动继承父类的返回类型:
from typing import Tuple, ReturnType from typing_extensions import Unpack class Parent: def _parse(self, input_dict: dict) -> Tuple[int, str]: return 1, "parent_id" class Child(Parent): def _parse(self, input_dict: dict) -> Tuple[int, str, Unpack[ReturnType[Parent._parse]]]: entity = 3 _id = "test" return (entity, _id, *super()._parse(input_dict))
这种方式下,父类_parse的返回类型变更时,子类标注会自动同步,多层继承场景下只需替换Parent为直接父类即可。
3. 定义类型别名(统一维护更高效)
如果多个子类都需要类似的返回类型标注,可以先定义一个类型别名,后续调整时只需修改别名定义:
from typing import Tuple, Any # 统一定义返回类型:前两个为int、str,后续为任意数量的任意类型 ParseResult = Tuple[int, str, Any, ...] class Child(Parent): def _parse(self, input_dict: dict) -> ParseResult: entity = 3 _id = "test" return (entity, _id, *super()._parse(input_dict))
内容的提问来源于stack exchange,提问作者HitLuca
相关产品推荐
相关产品推荐

