Написать функцию safeval(), которая работает почти как eval(), с несколькими отличиями:
- С помощью этой функции нельзя напрямую модифицировать глобальное пространство имён — ничего не произойдёт (см. пример)
модифицировать объекты в нём можно
Если в процессе вычисления произошло исключение NameError, возвращается исходная строка без изменений.
Все остальные исключения, начиная от Exception, игнорируются. В этом случае функция возвращает сам объект-исключение.
Здесь операция globals().__delitem__('safeval') сработала, но, очевидно, «safeval» удалился не из глобального пространства имён
Почитайте eval() ☺
- Разумеется, глобальное пространство имён всё равно можно модифицировать, это же Python! Но это должно быть не так просто.
3 a+b 'builtin_function_or_method' object is not subscriptable None safeval
Спойлер: