如何基于字符串形式的内置类型安全检查变量类型?
问题描述
有如下代码需求场景:
isinstance("my string", "str | int") isinstance("my string", "list")
是否存在一种方法,能够基于以字符串形式存储的合法类型,检查变量(如示例中的"my string")的类型?
已知该类型为Python内置类型(int / str / float 等),无需导入。
直接使用eval()的方案存在安全风险,除了通过正则/字符串拆分提取单个类型并匹配的大量if/else代码块外,是否有更安全的实现方式?
安全实现方案
方案1:利用typing模块解析类型字符串
通过临时类的注解机制,借助get_type_hints解析字符串形式的类型,再执行类型检查,该方法仅处理合法的内置类型与联合类型,无代码执行风险:
from typing import get_type_hints def check_type(value, type_str): class Temp: __annotations__ = {"x": type_str} target_type = get_type_hints(Temp)["x"] return isinstance(value, target_type) # 测试 print(check_type("my string", "str | int")) # 输出 True print(check_type("my string", "list")) # 输出 False
方案2:预定义内置类型映射并解析字符串
先维护合法内置类型的映射字典,拆分联合类型字符串后逐一验证,完全可控,避免任意代码执行:
BUILTIN_TYPES = { "int": int, "str": str, "float": float, "list": list, "dict": dict, "tuple": tuple, "set": set, "bool": bool } def check_type(value, type_str): type_names = [t.strip() for t in type_str.split("|")] for name in type_names: if name not in BUILTIN_TYPES: raise ValueError(f"不支持的类型:{name}") if isinstance(value, BUILTIN_TYPES[name]): return True return False # 测试 print(check_type("my string", "str | int")) # 输出 True print(check_type("my string", "list")) # 输出 False
内容的提问来源于stack exchange,提问作者Some Guy
相关产品推荐
相关产品推荐

