Python中如何为包含列表推导式的函数正确声明类型?
正确类型标注实现
Python 3.9 及以上版本
直接使用标准库内置的抽象基类标注即可:
from typing import TypeVar from collections.abc import Iterable, Container T = TypeVar('T') def dual_combinator(self, a: Iterable[T], b: Container[T]) -> list[T]: return [x for x in a if x in b]
Python 3.8 及更早版本
需要从typing模块导入对应抽象类型:
from typing import TypeVar, Iterable, Container, List T = TypeVar('T') def dual_combinator(self, a: Iterable[T], b: Container[T]) -> List[T]: return [x for x in a if x in b]
标注说明
Iterable[T]:匹配所有可迭代遍历的类型,只要支持for...in遍历就能用于列表推导,完全覆盖你要求的「兼容列表推导式的对象」需求,比原写法的List[T]适用范围宽得多,元组、生成器、集合等类型都可以作为参数a传入。Container[T]:匹配所有实现了__contains__方法的类型,也就是支持in运算符的所有对象,完全符合你对参数b的要求,列表、集合、字典、自定义的支持in运算的类都可以作为参数b传入。- 返回值
list[T]是准确的:列表推导的返回结果固定为列表类型,元素类型和a、b的公共元素类型T一致,不存在标注不准确的问题。
官方文档查找方法
- 通用类型标注规则、基础泛型类型的用法,直接查阅Python官方文档的
typing模块章节即可,里面有完整的类型说明、使用示例和最佳实践。 - 如果你需要标注支持某类特定行为的参数(比如支持遍历、支持in运算、支持长度计算),可以查阅Python官方文档的
collections.abc模块章节,这里列出了所有容器相关的抽象基类,每个基类对应的接口、支持的运算符都有明确说明,直接匹配你需要的行为选择对应的基类标注即可。
内容的提问来源于stack exchange,提问作者Jim Newton
相关产品推荐
相关产品推荐

