如何为函数内部定义并返回的类X添加正确的类型标注?
函数内定义类的类型标注方案
更新:正如chepner在评论中指出的,在函数内创建类并非良策,其运行速度比其他解决方案慢10到80倍。可查看我自答中的性能对比,其中也展示了类型标注的实现方法。
你编写的代码中,函数get_an_x返回一个内部定义的类X作为结构体,但直接用type或type[X]做返回类型标注无法让类型检查器识别X的属性,这里提供两种可行的解决方案:
方案一:使用协议(Protocol)定义类结构
在函数外部先定义一个协议,描述X类的属性结构,然后将函数返回类型标注为该协议的类型对象,这样类型检查器就能识别类的属性:
from typing import Protocol, Type class XProtocol(Protocol): foo: int bar: str baz: None | int | str # 根据实际允许的类型调整 def get_an_x() -> Type[XProtocol]: class X: foo = 1 bar = 'Hello' baz = None return X
方案二:使用字符串延迟注解
利用Python的字符串注解特性,直接将返回类型标注为'type[X]',让类型检查器在解析时能关联到函数内部的X类,不过这种方式的兼容性不如协议方案:
from typing import Type def get_an_x() -> 'type[X]': class X: foo = 1 bar = 'Hello' baz = None return X
补充说明
- 直接用
type做返回类型过于宽泛,类型检查器无法推断具体的属性信息; - 直接写
type[X]会报错,因为X是函数内部定义的类,外部作用域无法识别,字符串注解则能延迟类型解析,避开这个问题。
内容的提问来源于stack exchange,提问作者user1658543
相关产品推荐
相关产品推荐

