You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于字符串形式的内置类型安全检查变量类型?

问题描述

有如下代码需求场景:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 14:22:02