Python eval错误抑制

时间:2010-01-26 16:06:12

标签: python eval

首先,我知道eval的缺点,它将用于我想做的实验。

我正在创建一个像Brute-Force算法一样工作的脚本,但它不会破坏密码,而是找到一个特殊形式的方程式解决方案(更多细节是不必要的)。

会有很多字符串填充(通常语法不正确)的术语,如 1 + 2)+3

  • 是通过eval获取这些字词结果的唯一方法吗?
  • 如何让python忽略eval中发生的语法错误? (该计划不应终止)

4 个答案:

答案 0 :(得分:6)

取消SyntaxError

try:
    eval("1 + 2) + 3")
except SyntaxError:
    pass

答案 1 :(得分:3)

使用来自ast的literal_eval并捕获ValueError和SyntaxError

from ast import literal_eval
try:
    a = literal_eval('1+2)+3')
except (ValueError, SyntaxError):
    pass

答案 2 :(得分:1)

Eval通常会引发SyntaxError,您可以使用

覆盖代码
try:
  a = eval('1+2)+3')
except SyntaxError:
  pass

请记住,您可以隔离eval访问通过{ '__builtin__': None }作为第二个参数的任何函数。

答案 3 :(得分:1)

除了SyntaxError之外,还有更多可能的例外:

  • ZeroDivisionError,例如"1/0"

  • NameError,例如"franz/3"(未定义franz

  • TypeError,例如"[2, 4]/2"

甚至更多。所以,你可能想要抓住它们:

try:
    eval (expr)

except (SyntaxError, NameError, TypeError, ZeroDivisionError):
    pass

实际上,几乎所有现有的异常都可以抛出,任何代码的评估都可能造成任何破坏,除非你屏蔽掉函数(例如os.system ("rm -rf /"),另请参阅{{3} })。