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

能否让ast.literal_eval实现与eval相同的行为?

能不能让ast.literal_eval实现和eval一样的行为?

不行,这俩的设计目标完全不同,没办法做到。

核心原因:

  • ast.literal_eval是安全解析Python字面量的工具,只能处理字符串、数字、列表、字典、布尔值、None这类纯字面量结构,它不会去查找作用域中的变量、类或函数,更不会执行任意代码。你传入的"MyClass"是类名,不属于字面量范畴,所以会报错。
  • eval是执行任意Python表达式的工具,它会在当前作用域里查找对应的变量/类/函数,所以能直接返回MyClass类,但这也意味着如果传入恶意字符串,它会执行危险代码,安全性极低。

如果要安全地实现你的需求(从字符串获取类对象)

可以自己实现一个带白名单的安全函数,既避免eval的风险,又能拿到目标类:

import ast

class MyClass():
    pass

def safe_get_class(class_name_str):
    # 只允许白名单内的类被获取
    allowed_classes = {"MyClass": MyClass}
    
    # 先解析AST,确保输入是单纯的类名,避免注入攻击
    ast_tree = ast.parse(class_name_str, mode='eval')
    if not isinstance(ast_tree.body, ast.Name):
        raise ValueError("输入只能是单纯的类名")
    
    target_class_name = ast_tree.body.id
    return allowed_classes.get(target_class_name)

class_string = "MyClass"
ast_class = safe_get_class(class_string)
print(ast_class)  # 输出 <class '__main__.MyClass'>

这个方法通过AST检查输入格式,再用白名单限制可获取的类,既安全又能满足你的需求。

内容的提问来源于stack exchange,提问作者Chaban33

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 13:24:26