Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 30, 2012 15:15:34

koast
Зарегистрирован: 2012-12-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

exec()?

Есть список в котором хранятся имена переменных, надо получить список с их значениями(в том же порядке). Как это сделать?
PS Печатать значения я умею. С помощью exec().

Отредактировано koast (Дек. 30, 2012 15:27:33)

Офлайн

#2 Дек. 30, 2012 19:28:50

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

exec()?

Значения переменных по имени можно получить с помощью функции globals(), но если Вам это понадобилось без веской причины, то Ваш код требует глубокого переосмысления. Постольку поскольку этот вопрос вообще возник - веской причины нет. Думайте лучше над кодом, а не над путями обхода сложных мест. Если расскажите сообществу, в чем вообще Ваша задача состоит, уверен, что Вам помогут ее решить без костылей.



Офлайн

#3 Янв. 2, 2013 19:40:58

koast
Зарегистрирован: 2012-12-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

exec()?

FishHook
FishHook
Значения переменных по имени можно получить с помощью функции globals(), но если Вам это понадобилось без веской причины, то Ваш код требует глубокого переосмысления. Постольку поскольку этот вопрос вообще возник - веской причины нет. Думайте лучше над кодом, а не над путями обхода сложных мест. Если расскажите сообществу, в чем вообще Ваша задача состоит, уверен, что Вам помогут ее решить без костылей.
Итак, есть строка с арифметическим выражением, надо посчитать ее значение.

Офлайн

#4 Янв. 2, 2013 21:26:38

Viktors
От:
Зарегистрирован: 2011-10-23
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

exec()?

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

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



Отредактировано Viktors (Янв. 2, 2013 21:27:04)

Офлайн

#5 Янв. 3, 2013 10:06:12

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

exec()?

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

Офлайн

#6 Янв. 3, 2013 20:12:37

Viktors
От:
Зарегистрирован: 2011-10-23
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

exec()?

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



Офлайн

#7 Янв. 4, 2013 11:28:56

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

exec()?

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

Офлайн

#8 Янв. 4, 2013 12:03:44

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

exec()?

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

Офлайн

#9 Янв. 4, 2013 13:06:19

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

exec()?

Спасибо за ответ. Примерно это я и ожидал… А что Вы посоветуете делать в случае получения такого выражения? Парсер?

Офлайн

#10 Янв. 4, 2013 15:39:48

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

exec()?

Для калькулятора, наверное, парсер. В общем случае может помочь выполнение в песочнице (особо не интересовался, но вроде PyPy может), т.к. и за памятью надо следить. Например, с eval() остается такая возможность:

a = [1] * 99999999

А для выражений вроде “42**42**…” нужен timeout выполнения. На Unix signal.alarm() http://stackoverflow.com/a/2282656/1052325
А на Win, я так понял, только отдельный процесс поможет, т.к. вроде нельзя остановить поток c выполняемой арифметической операцией (может поправит кто-то?).

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version