Python评估错误抑制

Python评估错误抑制,python,eval,Python,Eval,首先,我知道eval的缺点,它将用于我只想做的一个实验 我正在创建一个脚本,它的工作原理与蛮力算法类似,但它不会破坏密码,而是找到一个特殊形式方程式的解决方案(不需要更多细节) 将有许多字符串填充(通常语法不正确)术语,如1+2)+3 是通过eval获得这些术语结果的唯一方法吗 如何使python忽略eval中出现的语法错误?(程序不应终止) 要抑制: 抑制: Eval通常会引发SyntaxError,您可以使用 try: a = eval('1+2)+3') except SyntaxE

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

我正在创建一个脚本,它的工作原理与蛮力算法类似,但它不会破坏密码,而是找到一个特殊形式方程式的解决方案(不需要更多细节)

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

  • 是通过
    eval
    获得这些术语结果的唯一方法吗
  • 如何使python忽略
    eval
    中出现的语法错误?(程序不应终止)
要抑制:

抑制:


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

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

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

eval通常会引发语法错误,您可以使用

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

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

使用ast中的literal\u eval,并捕获ValueError和SyntaxError

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

改为使用ast中的文字值,并捕获ValueError和SyntaxError

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

除了SyntaxError之外,还有更多的例外情况:

  • ZeroDivision错误,例如对于
    “1/0”

  • 名称错误,例如用于
    “franz/3”
    (未定义
    franz

  • 类型错误,例如,
    “[2,4]/2”

甚至更多。因此,您可能希望捕获所有这些:

try:
    eval (expr)

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

事实上,几乎所有现有的异常都可能被抛出,任何代码的评估都可能造成破坏,除非您将函数(例如,
os.system(“rm-rf/”)
,另请参见)。

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

  • ZeroDivision错误,例如对于
    “1/0”

  • 名称错误,例如用于
    “franz/3”
    (未定义
    franz

  • 类型错误,例如,
    “[2,4]/2”

甚至更多。因此,您可能希望捕获所有这些:

try:
    eval (expr)

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

实际上,几乎所有现有的异常都可能被抛出,任何代码的评估都可能造成破坏,除非您将函数隔离(例如,
os.system(“rm-rf/”)
,另请参见).

谢谢-看起来非常pythonic:DThanks-看起来非常pythonic:dy您无法保护eval不被访问函数:您无法保护eval不被访问函数:如果您使用映射,也可能会出现KeyError。如果您使用映射,也可能出现KeyError。