Обновить
1
0

Пользователь

Отправить сообщение

позволит создать строку

Именно, позволит создать строку. `eval` для строки "some"+"thing" выполнит так называемую конкатенацию (склеивание) строки, а не саму строку. То есть в ответ мы получим строку которую уже никакой оператор не выполнит --> "something" (Можете посмотреть, он вернёт str, то есть только выполнит конкатенацию).

def calculator(command):
    if 'exec' in command or 'eval' in command:
        raise SyntaxError
    result = eval(command)
    if type(result) in [int, float]:
        return print(result) 
    else:
        raise SyntaxError 

try:
    calculator(input())
except SyntaxError as e:
      print('Syntax Error')

Бесспорно в статье разбирается достаточное количество материала которое я не знал и скорее всего буду использовать в будущем, за что спасибо автору.
Но если задача стоит конкретно в том чтобы ограничить пользователю доступ к окружению. Почему не использовать код представленный выше?

Логика кода если кому-то надо:
Мы не сразу вычисляем строку (не вызываем eval), а проверяем полученную строку.
Мы не допускаем возможность ввода `exec` и `eval` вовсе (если в строке всё же есть exec или eval, мы просто поднимаем SyntaxError). Далее проводим вычисление (вызываем eval) и если оно возвращает рациональное число, то выводим результат (в противном случае, снова поднимем SyntaxError)

Если я в чём то ошибся, то поправьте пожалуйста, благодарю.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность