如何直接检查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
相关产品推荐
相关产品推荐

