Python 3.9 如何为函数返回的字典keys对象指定类型标注
正确标注方案
Python 3.9+ 下直接使用collections.abc.KeysView做泛型标注即可,不需要依赖私有类型,也不需要强制转列表:
from collections.abc import KeysView # 假设my_dict的键类型为str,值类型为int,你可以替换为实际的键值类型 my_dict: dict[str, int] = {"foo": 1, "bar": 2} def my_func() -> KeysView[str]: return my_dict.keys()
KeysView是Python标准库定义的字典键视图抽象基类,所有Python实现的字典键返回对象都符合这个接口定义,Pylance、mypy等类型检查器都可以正确识别。
关于私有类型_dict_keys的说明
你看到的_dict_keys[key_type, value_type]是类型标注库typeshed中,对CPython专属的dict_keys具体实现类的私有标注,属于底层实现细节,不对外暴露使用:
- 不要直接引用这个私有类型作为标注,不同Python解释器(比如PyPy)的字典键实现类型不一定相同,用私有类型会导致跨实现的类型标注失效
- 后续CPython如果调整内部实现,这个私有类型的命名、结构都可能变化,会直接导致你的类型标注报错
是否要转成列表返回?
两种方案没有绝对的优劣,取决于你的实际使用场景:
- 如果你返回的键需要被调用方修改、或者需要按下标随机访问,那转成
list[key_type]返回更合理 - 如果调用方仅需要遍历键、做成员判断,直接返回
KeysView更高效,不需要额外内存拷贝生成列表,是更推荐的方案
内容的提问来源于stack exchange,提问作者Splines
相关产品推荐
相关产品推荐

