能否让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
相关产品推荐
相关产品推荐

