导入__future__ annotations后,检查字段是否为dataclass失效的求助
解决
from __future__ import annotations下is_dataclass判断失效的问题 问题根源是from __future__ import annotations会让所有类型注解以字符串形式存储,而非实际的类型对象。所以fields(B)返回的字段type属性只是字符串"A",而非A类本身,自然is_dataclass会返回False。
不用移除annotations(也就不用把大量T | None改成Optional[T])的解决办法:
- 使用
typing.get_type_hints解析实际类型
这个函数会自动把字符串形式的注解转换成对应的实际类型对象,完美适配你的场景。
示例代码:
from __future__ import annotations from dataclasses import dataclass, is_dataclass, field, fields from typing import get_type_hints @dataclass class A: a: int | None = None b: int | None = None @dataclass class B: a_obj: A = field(default_factory=A) x: int = 0 y: int = 0 # 获取B类解析后的类型提示字典 b_type_hints = get_type_hints(B) for f in fields(B): # 通过字段名从类型提示字典中拿到实际类型 actual_type = b_type_hints[f.name] print(f"{f.name}: {is_dataclass(actual_type)}") # 输出结果: # a_obj: True # x: False # y: False
原理说明:get_type_hints会遍历类的注解,自动处理字符串形式的类型引用,将其解析为对应的类或类型对象,这样is_dataclass就能正确判断字段类型是否为数据类了。
内容的提问来源于stack exchange,提问作者demberto
相关产品推荐
相关产品推荐

