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

如何直接检查Python Dataclass定义的变量的指定类型?

问题解答

首先,默认情况下无法识别到你定义的INT64、BIGINT这类类型别名,原因很简单:你写的INT64 = int只是给内置类型int起了个别名,本质上INT64和int指向的是同一个对象。当dataclass处理字段类型时,只会存储原类型(比如int、str),不会保留别名信息。

另外你提供的遍历代码存在问题:TempClass.__dataclass_fields__的元素是字段名称(字符串),所以type(_i)输出的是<class 'str'>,根本不是字段的类型。正确的写法应该是获取每个字段的type属性:

for field_name in TempClass.__dataclass_fields__:
    field = TempClass.__dataclass_fields__[field_name]
    print(field.type)

但即便修正后,输出的依然是int、str,而非你定义的别名。

解决办法:用typing.NewType创建可识别的类型别名

如果你想让dataclass在运行时保留自定义的类型标识,可以用typing.NewType来创建类型别名——它会生成一个独立的类型对象,和原类型明确区分开:

from dataclasses import dataclass
from typing import NewType

INT64 = NewType('INT64', int)
BIGINT = NewType('BIGINT', int)
VARCHAR256 = NewType('VARCHAR256', str)
VARCHAR512 = NewType('VARCHAR512', str)

@dataclass
class TempClass(object):
    v1: INT64
    v2: BIGINT
    v3: VARCHAR256
    v4: VARCHAR512

此时运行修正后的遍历代码:

for field_name in TempClass.__dataclass_fields__:
    field = TempClass.__dataclass_fields__[field_name]
    print(field.type)

输出结果就是你期望的:

INT64
BIGINT
VARCHAR256
VARCHAR512

注意:NewType创建的类型在运行时是原类型的包装器,赋值时仍可使用原类型的值,但类型检查工具(如mypy)会将其视为独立类型,完全满足运行时识别别名的需求。

补充:Python 3.10+的TypeAlias注解

如果你使用Python 3.10及以上版本,可通过typing.TypeAlias标注类型别名,但这仅用于静态类型检查,运行时依然不会保留别名信息:

from typing import TypeAlias

INT64: TypeAlias = int

这种方式下,dataclass存储的还是int,无法在运行时区分INT64和int,因此若要实现运行时识别别名,NewType是更合适的方案。

内容的提问来源于stack exchange,提问作者Jmob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:22:42