Python中支持多序列类型的slice函数如何正确书写类型注解?
错误原因
你之前的写法报错是因为定义TypeVar T 时引入了未绑定的类型变量 E:E 没有出现在函数的参数、返回值签名中,mypy 无法推导 E 的具体类型,因此抛出未绑定错误。同时你不需要将 Sequence[E] 显式列在 TypeVar 的约束列表里。
正确实现
针对 Python 3.9+ 环境,有两种常用的合法写法:
通用兼容写法
如果希望该函数支持所有可切片的序列类型(除了你用到的 str/bytes/list 外,也包含 tuple 等其他序列子类),可以直接用绑定到 Sequence 基类的 TypeVar 实现:
from typing import TypeVar from collections.abc import Sequence T = TypeVar("T", bound=Sequence) def slice(seq: T) -> T: return seq[1:3]
限定类型写法
如果希望严格限制仅支持 str/bytes/list 三种输入类型,可以直接把这三类写到 TypeVar 的约束列表里,3.9+ 支持直接用内置集合类型做注解:
from typing import TypeVar T = TypeVar("T", str, bytes, list) def slice(seq: T) -> T: return seq[1:3]
校验说明
以上两种写法都可以通过 mypy 校验,也能覆盖你给出的三个断言用例:
- 传入
str返回str - 传入
bytes返回bytes - 传入
list[int]返回list[int]
内容的提问来源于stack exchange,提问作者Nayuki
相关产品推荐
相关产品推荐

