python 2.6. Чем заменить eval?

Модератор: Модераторы разделов

Аватара пользователя
changer0
Сообщения: 82
ОС: Debian lenny

python 2.6. Чем заменить eval?

Сообщение changer0 »

Предположим, есть такой код

Код: Выделить всё

y = eval(str(expression))
, где expression вводится пользователем ('sin(x)', 'x+20*x**2' и т.д.).
Но здесь имеется проблема в связи с тем, что eval обрабатывает любое python-выражение.
Есть ли какая альтернатива (может в numpy есть подходящая функция), чтобы самому не создавать велосипед с проверкой содержимого вычисляемого выражения)?
Автор благодарит алфавит за любезно предоставленные буквы ©
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: python 2.6. Чем заменить eval?

Сообщение watashiwa_daredeska »

changer0 писал(а):
06.03.2011 13:18
имеется проблема в связи с тем, что eval обрабатывает любое python-выражение.
А надо не любое? А какое?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: python 2.6. Чем заменить eval?

Сообщение /dev/random »

watashiwa_daredeska писал(а):
07.03.2011 20:23
А надо не любое? А какое?

Включаю телепатию: ему нужны математические выражения, и при этом нужно, чтобы выражение для вычисления было безопасно брать из недоверенного источника.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: python 2.6. Чем заменить eval?

Сообщение watashiwa_daredeska »

/dev/random писал(а):
07.03.2011 21:29
нужно, чтобы выражение для вычисления было безопасно брать из недоверенного источника.
Только самописный транслятор, в стандартной библиотеке ничего подобного нет. Ну, или искать что-то готовое на стороне, хотя такой примитив обычно можно найти только в учебниках про лексические анализаторы/парсеры :)
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: python 2.6. Чем заменить eval?

Сообщение /dev/random »

watashiwa_daredeska писал(а):
07.03.2011 22:25
Только самописный транслятор, в стандартной библиотеке ничего подобного нет. Ну, или искать что-то готовое на стороне, хотя такой примитив обычно можно найти только в учебниках про лексические анализаторы/парсеры :)

В некоторых языках на этот случай есть возможность выполнять код в искусственном окружении, где опасных функций просто не будет (точнее, не будет вообще никаких функций, пока их поштучно не добавит туда программист). Нет ли такого в питоне?

Upd: нагуглил, есть. http://diveintopython3.org/advanced-iterators.html#eval
Спасибо сказали:
Аватара пользователя
changer0
Сообщения: 82
ОС: Debian lenny

Re: python 2.6. Чем заменить eval?

Сообщение changer0 »

/dev/random писал(а):
07.03.2011 22:42
watashiwa_daredeska писал(а):
07.03.2011 22:25
Только самописный транслятор, в стандартной библиотеке ничего подобного нет. Ну, или искать что-то готовое на стороне, хотя такой примитив обычно можно найти только в учебниках про лексические анализаторы/парсеры :)

В некоторых языках на этот случай есть возможность выполнять код в искусственном окружении, где опасных функций просто не будет (точнее, не будет вообще никаких функций, пока их поштучно не добавит туда программист). Нет ли такого в питоне?

Upd: нагуглил, есть. http://diveintopython3.org/advanced-iterators.html#eval

Замечательно. То, что нужно. Спасибо.
Автор благодарит алфавит за любезно предоставленные буквы ©
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: python 2.6. Чем заменить eval?

Сообщение /dev/random »

Да, только должен предупредить. Как в случае ручного вычисления, так и в случае трюков с eval() нужно что-то предпринять на случай сумашедших выражений. Например, "2 ** 2 ** 1000000" съест весь своп и сдохнет от OOM-киллера.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: python 2.6. Чем заменить eval?

Сообщение watashiwa_daredeska »

/dev/random писал(а):
07.03.2011 22:42
Upd: нагуглил, есть. http://diveintopython3.org/advanced-iterators.html#eval
http://wiki.python.org/moin/SandboxedPython так, на всякий случай. Ибо вся эта тряхомудия давно признана insecure — одно неверное движение и трындец.
Спасибо сказали: