Избегайте exec
и eval
Использование exec
и eval
в Python вызывает неодобрение.
Есть лучшие альтернативы
С верхнего ответа (выделено мое):
Для заявлений используйте exec
.
Если вам нужно значение выражения, используйте eval
.
Однако первым шагом должно быть спросить себя, действительно ли вам это нужно. Выполнение кода обычно должно быть последним средством : Это медленно, безобразно и опасно, если он может содержать введенный пользователем код. Вы всегда должны сначала смотреть на альтернативы, такие как функции высшего порядка , чтобы увидеть, могут ли они лучше удовлетворить ваши потребности.
С Альтернативы exec / eval?
установить и получить значения переменных с именами в строках
[хотя eval
] будет работать, обычно не рекомендуется использовать имена переменных, имеющие значение для самой программы.
Вместо этого лучше использовать дикт.
Это не идиоматично
С http://lucumr.pocoo.org/2011/2/1/exec-in-python/ (акцент мой)
Python не является PHP
Не пытайтесь обойти идиомы Python, потому что другой язык делает это по-другому. Пространства имен есть в Python по определенной причине и только потому, что он дает вам инструмент exec
, это не значит, что вы должны использовать этот инструмент.
Опасно
С http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html (выделено мое)
Так что eval не безопасен, даже если вы удалите все глобалы и встроенные функции!
Проблема со всеми этими попытками защитить eval () заключается в том, что они являются черными списками . Они явно удаляют вещи, которые могут быть опасными. Это проигрышная битва, потому что если в списке остается только один элемент, вы можете атаковать систему .
Итак, можно ли сделать eval безопасным? Тяжело сказать. На данный момент, я думаю, вы не можете причинить вреда, если не можете использовать двойные подчеркивания, поэтому, возможно, если вы исключите любую строку с двойным подчеркиванием, вы в безопасности. Может быть ...
Трудно читать и понимать
С http://stupidpythonideas.blogspot.it/2013/05/why-evalexec-is-bad.html (выделено мое):
Во-первых, exec
затрудняет чтение вашего кода . Чтобы выяснить, что происходит, мне не нужно просто читать ваш код, Мне нужно прочитать ваш код, выяснить, какую строку он будет генерировать, а затем прочитать этот виртуальный код. Итак, если Вы работаете в команде, или публикуете программное обеспечение с открытым исходным кодом, или просите о помощи где-нибудь, например, в StackOverflow, и вам мешает помогать другим людям. И если есть шанс, что вы будете отлаживать или расширять этот код через 6 месяцев, вы сами усложняете его.