首先,我知道eval的缺点,它将用于我想做的实验。
我正在创建一个像Brute-Force算法一样工作的脚本,但它不会破坏密码,而是找到一个特殊形式的方程的解决方案(更多细节是不必要的)。
会有很多字符串填充(通常语法上不正确)的术语,如1 + 2)+3
eval
获得这些条款结果的唯一方法吗?eval
中发生的语法错误? (该程序不应终止)要压制SyntaxError
:
try:
eval("1 + 2) + 3")
except SyntaxError:
pass
使用来自ast的literal_eval代替并捕获ValueError和SyntaxError
from ast import literal_eval
try:
a = literal_eval('1+2)+3')
except (ValueError, SyntaxError):
pass
Eval通常会引发SyntaxError,您可以使用
try:
a = eval('1+2)+3')
except SyntaxError:
pass
请记住,您可以将eval
与访问传递{ '__builtin__': None }
作为第二个参数的任何函数隔离开来。
除了SyntaxError之外,还有更多可能的异常:
"1/0"
"franz/3"
(与undefined franz
)"[2, 4]/2"
甚至更多。所以,你可能想要抓住它们:
try:
eval (expr)
except (SyntaxError, NameError, TypeError, ZeroDivisionError):
pass
实际上,几乎所有现有的异常都可以被抛出,并且任何代码的评估都可能造成任何破坏,除非你屏蔽掉函数(例如os.system ("rm -rf /")
,另见Eval really is dangerous)。