解析类型提示字符串,提取Tuple内部子类型的解决方案
解析Python Tuple类型提示的子类型方案
你完全不需要自己写复杂正则,有现成工具可以搞定:
第三方库:typing-inspect
这是专门针对Python类型提示设计的解析库,对嵌套类型的支持非常完善。
- 安装:
pip install typing-inspect - 示例代码:
from typing import Tuple, Union import typing_inspect # 你的目标类型字符串 type_str = "Tuple[Union[file.File, directory.Directory, Tuple[file.File, directory.Directory]], Tuple[file.File, directory.Directory]]" # 把字符串转为实际类型对象(需提前导入file、directory模块里的类) type_obj = eval(type_str) # 直接提取元组的子类型 subtypes = typing_inspect.get_args(type_obj) # 输出结果就是你要的列表/元组形式 print(subtypes)
标准库:ast
不想装第三方包的话,用Python自带的抽象语法树模块ast也能精准解析:
- 示例代码:
import ast def get_tuple_subtypes(type_str): # 解析字符串为AST节点 tree = ast.parse(type_str, mode='eval') tuple_node = tree.body # 验证输入确实是Tuple类型 if not (isinstance(tuple_node, ast.Subscript) and isinstance(tuple_node.value, ast.Name) and tuple_node.value.id == 'Tuple'): raise ValueError("输入不是合法的Tuple类型字符串") # 提取Tuple内的参数节点 slice_node = tuple_node.slice if isinstance(slice_node, ast.Tuple): elements = slice_node.elts else: # 处理单元素元组的情况,比如Tuple[int] elements = [slice_node] # 将每个节点转回字符串形式 return [ast.unparse(elem) for elem in elements] # 测试 type_str = "Tuple[Union[file.File, directory.Directory, Tuple[file.File, directory.Directory]], Tuple[file.File, directory.Directory]]" print(get_tuple_subtypes(type_str))
运行后会直接返回你期望的子类型字符串列表。
内容的提问来源于stack exchange,提问作者dsollen
相关产品推荐
相关产品推荐

