Python eval错误抑制

问题描述 投票:1回答:4

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

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

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

  • 是通过eval获得这些条款结果的唯一方法吗?
  • 如何让python忽略在eval中发生的语法错误? (该程序不应终止)
python eval
4个回答
6
投票

要压制SyntaxError

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

3
投票

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

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

1
投票

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

try:
  a = eval('1+2)+3')
except SyntaxError:
  pass

请记住,您可以将eval与访问传递{ '__builtin__': None }作为第二个参数的任何函数隔离开来。


1
投票

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

  • ZeroDivisionError,例如为"1/0"
  • NameError,例如为"franz/3"(与undefined franz
  • TypeError,例如为"[2, 4]/2"

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

try:
    eval (expr)

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

实际上,几乎所有现有的异常都可以被抛出,并且任何代码的评估都可能造成任何破坏,除非你屏蔽掉函数(例如os.system ("rm -rf /"),另见Eval really is dangerous)。

© www.soinside.com 2019 - 2024. All rights reserved.