Python类型注解常用技巧 python常用注解static method

当在python中使用`typing.annotated`时,复杂的类型可能会导致元数据而冗长冗长。本教程旨在解决如何从深度的`annotated`结构中得到简单的“裸”类型,而不改变原始定义。我们将介绍一个强大的导出函数,它能在运行时返回提示树,断开有效的`annotat ed`包装器,从而得到一个干净、无注解的类型表示,这对于需要纯粹的景关键。理解typing.Annotated挑战及其挑战
typing.Annotated是Python 3.9引入的一个强大工具,它允许开发者在类型提示中上下文特定的元数据添加,而不会影射3D图像来自:typing import Annotated,tuple,listPoint3D = Annotated[tuple[float,float,float],quot;A 3D Pointquot;]Points = Annotated[list[Point3D],quot;集合点quot;]登录后复制
然而,当我们需要获取这些类型的“其清理”表示时,Annotated元数据可能会带来困扰。直接打印Points会显示所有创伤的注解:typing.Annotated[list[typing.Annotated[tuple[float,float,float],'A 3D Point']],'A collection of点']登录后复制
在某些场景下,例如生成API文档、进行运行时类型检查或序列化时,我们可能只需要list[tuple[float, float, float]]这样的裸类型,而不需要任何注解信息。为什么简单的get_args解决问题
打字模块提供了get_args函数,用于获取泛型类型的参数。尝试使用get_args(Points)[0]可以删除最外层的Annotated,但无法深入处# 假设Points = Annotated[list[Annotated[tuple[float, float, float], 'A 3D Point']], '一个集合of point']# get_args(Points)[0] 结果会是:# list[typing.Annotated[tuple[float, float, float], 'A 3D Point']]登录后复制
正如所见,内部的'A 3D Point'注解依然存在,这表明我们需要一种更全面的方法来地方式切断所有注解。 tated的解决方案
解决此问题的关键在于递归地遍历类型提示的结构(可以将其视为一个类型树),并在遇到带注释的节点时,将替换捥个参数)。键入模块中的get_origin和get_args函数是实现其这一遍历的基石。
0 查看详情 0 get_origin(type_object):返回泛型类型(如list[int])的原始类型(如list)。对于非泛型类型,返回None。get_args(type_object):下面是实现该功能的循环函数:from Typing import Annotated, get_args, get_origin, Anydef Convert_annotated_to_bare_types(type_object: Any) -gt; Any: quot;quot;quot; quot;quot;quot; # 获取类型对象的原始类型(如 list[int] 的 list)和参数(如 int) origin, args = get_origin(type_object), get_args(type_object) # 情况 1:如果没有原始类型,说明这不是一个泛型类型(如 int, str, float) # If origin is None: return type_object # 情况2: 如果原始类型是 带注释,说明我们遇到了一个注解类型。 # 带注释的第一个参数是其基础类型,我们依次处理这个基础类型。
if origin is Annotated: bare_type = get_args(type_object)[0] Converted_args = [ Convert_annotated_to_bare_types(arg) for arg in args ] # 数重新构造泛型类型。 # 例如,list[*converted_args] 会重构为list[处理后面的参数] return origin[*converted_args]登录后复制示例与应用
让我们使用之前定义的Points类型来测试这个函数:# Point3D = Annotated[tuple转换[float, float, float], quot;A 3D Pointquot;]Points = Annotated[list[Point3D], quot;点的集合quot;]#使用函数bare_points_type = Convert_annotated_to_bare_types(Points)print(fquot;原始类型: {Points}quot;)print(fquot;转换后的裸类型: {bare_points_type}quot() '一个集合of point']转换后的裸类型:list[tuple[float,float,float]]登录后复制
这就是我们期望的结果,所有解析的注解:convert_annotated_to_bare_types是一个运行时函数,它在程序执行时检查并转换类型对象。说明:此函数是纯粹的,它返回类型定义。这意API文档生成:API文档生成:API文档生成:API文档生成:当你希望在文档中显示简洁的类型签名,而不包含内部注解元数据时。数据验证/序列化:或序列化(如Py dantic模型)时,可以先断开注解。自定义类型检查:在构建自己的运行时类型检查工具时,且需要忽略带注释的元数据时。任何类型处理:对于Any类型,get_origin返回None,get_args返回(),函数会直接返回Any,行为符合预期。
通过这种梯度遍历和替换的方法,我们可以有效地进行管理和利用打字。注释:类型提示的灵活和实用性。
以上就是Python类型注解:运行时高说明:相关标签: python工具 为什么梯度函数 Python Float 梯度 int 泛型对象 大家都在看: PythonZeroDivisionError处理方法 Python爬虫怎样进行合规爬取_Python爬虫遵循机器人协议与法律规范的方法 Python Python怎样爬虫使用XPath解析_Python爬虫利用XPath提取网页元素的技巧Python开发环境需要联网吗_离线与在线
