You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为函数内部定义并返回的类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:35:33