如何将Python字符串形式的类型注解转换为实际的类型对象?
Python字符串形式类型注解转实际类型对象的方法
Python中开启from __future__ import annotations后所有类型注解会以字符串形式存储,要在运行时拿到实际类型对象,优先使用标准库内置的typing.get_type_hints方法即可,该方法会自动解析字符串注解、处理作用域和前向引用问题,兼容所有支持类型注解的Python版本。
针对dataclass场景的使用示例
你给出的示例代码修改后如下,无论是否开启future annotations导入,都可以正确拿到实际类型:
# 不管是否开启以下导入都不影响最终结果 from __future__ import annotations import dataclasses from typing import get_type_hints ObjectId = int @dataclasses.dataclass class Sample: id: ObjectId def main() -> None: fields = dataclasses.fields(Sample) # 直接读取dataclass字段的原始type属性是未解析的字符串 print(fields[0].type) # 开启future导入时输出 "ObjectId" # 调用get_type_hints获取解析后的全类注解字典 resolved_hints = get_type_hints(Sample) print(resolved_hints['id']) # 始终输出 <class 'int'> print(resolved_hints['id'] is int) # 始终输出 True main()
注意事项
get_type_hints返回的字典key是类字段名,value就是实际的类型对象,泛型、联合类型、Optional等复杂类型都可以正确解析,不需要手动处理语法。- 不推荐直接使用
eval解析字符串注解,手动调用eval很难严格对齐类型定义的作用域,还存在安全风险,只有在特殊需要单独解析单个字符串的场景下,才可以配合类型定义所在模块的全局命名空间使用,示例如下:# 仅特殊场景使用,需确保上下文正确 mod = __import__(Sample.__module__) resolved_type = eval(fields[0].type, vars(mod)) print(resolved_type is int) # 输出 True
内容的提问来源于stack exchange,提问作者edA-qa mort-ora-y
相关产品推荐
相关产品推荐

