Именно, позволит создать строку. `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)
Если я в чём то ошибся, то поправьте пожалуйста, благодарю.
Именно, позволит создать строку. `eval` для строки "some"+"thing" выполнит так называемую конкатенацию (склеивание) строки, а не саму строку. То есть в ответ мы получим строку которую уже никакой оператор не выполнит --> "something" (Можете посмотреть, он вернёт str, то есть только выполнит конкатенацию).
Бесспорно в статье разбирается достаточное количество материала которое я не знал и скорее всего буду использовать в будущем, за что спасибо автору.
Но если задача стоит конкретно в том чтобы ограничить пользователю доступ к окружению. Почему не использовать код представленный выше?
Логика кода если кому-то надо:
Мы не сразу вычисляем строку (не вызываем eval), а проверяем полученную строку.
Мы не допускаем возможность ввода `exec` и `eval` вовсе (если в строке всё же есть exec или eval, мы просто поднимаем SyntaxError). Далее проводим вычисление (вызываем eval) и если оно возвращает рациональное число, то выводим результат (в противном случае, снова поднимем SyntaxError)
Если я в чём то ошибся, то поправьте пожалуйста, благодарю.