Подавление ошибок Python eval - PullRequest
1 голос
/ 26 января 2010

Во-первых, я знаю о недостатках eval, и он будет использован в эксперименте, который я хочу провести.

Я создаю скрипт, который работает так же, как алгоритм Brute-Force, но он не взламывает пароли, а находит решение для специальной формы уравнения (больше подробностей не требуется).

Будет много строк, заполненных (часто синтаксически некорректными) терминами вроде 1 + 2) + 3

  • Это единственный способ получить результаты этих терминов через eval?
  • Как заставить python игнорировать синтаксические ошибки, возникающие в eval? (Программа не должна завершаться)

Ответы [ 4 ]

6 голосов
/ 26 января 2010

Для подавления SyntaxError:

try:
    eval("1 + 2) + 3")
except SyntaxError:
    pass
3 голосов
/ 25 июля 2011

используйте взамен astral_eval и перехватывайте ValueError и SyntaxError

from ast import literal_eval
try:
    a = literal_eval('1+2)+3')
except (ValueError, SyntaxError):
    pass
1 голос
/ 28 декабря 2017

Возможно больше исключений, чем только 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 /"), см. Также Eval действительно опасен ).

1 голос
/ 26 января 2010

Eval обычно вызывает SyntaxError, вы можете закрыть свой код с помощью

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

Помните, вы можете изолировать eval от доступа к любым функциям, передающим { '__builtin__': None } в качестве второго параметра.

...