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

在Python字典中使用eval求值键值时如何避免引入不必要内容

解决eval执行字典表达式时注入冗余内容的问题

这个问题我之前也踩过坑!核心原因是当你把原字典直接传给eval的第二个参数(命名空间)时,Python会自动将内置的__builtins__模块注入到这个字典中,导致它被意外添加到你的原字典里。

下面给你几个可行的解决方案:

方案一:使用临时命名空间(推荐)

创建一个独立的临时字典作为eval的命名空间,这样原字典就不会被__builtins__污染,计算完成后再把结果赋值回原字典的目标键:

dict_ = {'x': 1, 'y': 2, 'z':'x+y'}
# 复制原字典的内容到临时命名空间
temp_namespace = dict(dict_)
# 用临时空间执行表达式,结果赋值给原字典的z键
dict_['z'] = eval(dict_['z'], temp_namespace)
print(dict_)  # 输出: {'x': 1, 'y': 2, 'z': 3}

方案二:手动删除冗余键(不推荐)

如果只是临时应急,也可以在eval执行完成后手动删除__builtins__键,但这种方法不够优雅——如果你的字典原本就有这个键(虽然概率极低),会误删原有内容:

dict_ = {'x': 1, 'y': 2, 'z':'x+y'}
dict_['z'] = eval(dict_['z'], dict_)
# 删除自动注入的__builtins__
del dict_['__builtins__']
print(dict_)  # 输出: {'x': 1, 'y': 2, 'z': 3}

额外提醒:eval的安全风险

如果你的表达式字符串来自不可信的外部输入,一定要避免使用eval,它会执行任意Python代码,存在严重的安全隐患。这种情况下可以考虑用ast.literal_eval结合自定义的表达式解析逻辑,或者使用专门的表达式求值库来限制执行范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:29:08