Найти - Пользователи
Полная версия: exec()?
Начало » Python для новичков » exec()?
1
koast
Есть список в котором хранятся имена переменных, надо получить список с их значениями(в том же порядке). Как это сделать?
PS Печатать значения я умею. С помощью exec().
FishHook
Значения переменных по имени можно получить с помощью функции globals(), но если Вам это понадобилось без веской причины, то Ваш код требует глубокого переосмысления. Постольку поскольку этот вопрос вообще возник - веской причины нет. Думайте лучше над кодом, а не над путями обхода сложных мест. Если расскажите сообществу, в чем вообще Ваша задача состоит, уверен, что Вам помогут ее решить без костылей.
koast
FishHook
FishHook
Значения переменных по имени можно получить с помощью функции globals(), но если Вам это понадобилось без веской причины, то Ваш код требует глубокого переосмысления. Постольку поскольку этот вопрос вообще возник - веской причины нет. Думайте лучше над кодом, а не над путями обхода сложных мест. Если расскажите сообществу, в чем вообще Ваша задача состоит, уверен, что Вам помогут ее решить без костылей.
Итак, есть строка с арифметическим выражением, надо посчитать ее значение.
Viktors

можно использовать eval

Но сомневаюсь, что это хорошая практика.

dimy44
Если знаешь, что делаешь, чем eval плох-то, вот непойму! Сам несколько раз на смартфоне писал калькулятор, результат выражения именно так и считывался, обработать ошибки не составляет труда, наряду со слежением за корректностью ввода значений. А зачем тогда вообще eval придумывали, что все так от него открещиваются?
Viktors

eval, как известно, предоставляет возможность сделать иньекцию кода. Например, можно импортировать модуль для работы с ОС, а дальше - насколько хватит фантазии

dimy44
Извините за вспыльчивый мой предыдущий пост, просто уже не в первый раз люди пишут, что eval использовать нежелательно (насчет exec то-же), предлагали вычислять выражение парсерами, когда, черт возьми, eval же. Объяснить кто-то сможет, почему нет, своими словами, без отмазки ссылками на доки?
reclosedev
dimy44
Извините за вспыльчивый мой предыдущий пост, просто уже не в первый раз люди пишут, что eval использовать нежелательно (насчет exec то-же), предлагали вычислять выражение парсерами, когда, черт возьми, eval же. Объяснить кто-то сможет, почему нет, своими словами, без отмазки ссылками на доки?
Судя по сообщению ТС, можно обойтись без eval если переписать код.

Чем же eval плох? В случае с локальным калькулятором, eval может и пойдет, пользователь сам виноват если вызовет os.system(“rm -rf /”).
Но представьте, что это онлайн калькулятор. Трюки с пустыми __builtins__, locals, globals и т.п. можно обойти http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html , а без таймаутов можно будет загрузить CPU сервера вот таким безобидным выражением:
42**42**42**42**42

dimy44
Спасибо за ответ. Примерно это я и ожидал… А что Вы посоветуете делать в случае получения такого выражения? Парсер?
reclosedev
Для калькулятора, наверное, парсер. В общем случае может помочь выполнение в песочнице (особо не интересовался, но вроде PyPy может), т.к. и за памятью надо следить. Например, с eval() остается такая возможность:
a = [1] * 99999999

А для выражений вроде “42**42**…” нужен timeout выполнения. На Unix signal.alarm() http://stackoverflow.com/a/2282656/1052325
А на Win, я так понял, только отдельный процесс поможет, т.к. вроде нельзя остановить поток c выполняемой арифметической операцией (может поправит кто-то?).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB