/
Вопросы и ответы
/
Python
/

Что делает метод eval python?

Что делает метод eval python?

4 года назад

Andrey Moshkov

Ответы

0

Метод eval в Python выполняет строку, переданную ему в качестве аргумента, как выражение на языке Python и возвращает результат выполнения.

1
2
3
4
5
x = 1
y = 2
result = eval("x + y")
print(result)
# Вывод: 3

Внимание: Использование eval может быть опасным, так как позволяет выполнять произвольный код, что может привести к уязвимостям в безопасности.

2 года назад

Elena Gromova

0

Функция eval() анализирует переданную ей строку и если строка окажется кодом, то он будет выполнен:

1
2
3
4
5
6
7
8
9
10
11
x = 'print(55)'

eval(x) # => 55

x = '4 + 7'

print(eval(x)) # => 11

x = '2 > 11'

print(eval(x)) # => False

Но стоит с большой осторожностью пользоваться этой функцией и уж точно ни в коем случае нельзя передавать ей данные, которые может ввести пользователь. Функция eval() выполнит любой код, который сможет распознать и если, допустим, ей передать строку rm -rf /, то корневая директория (если говорим о Linux) будет удалена без всяких вопросов и предостережений. Поэтому следует помнить о том, что пользоваться этой функцией надо с осторожностью и не предоставлять ей данные, вводимые пользователем.

4 года назад

Владимир Устянивский

0

eval() принимает строку, выполняет её как выражение Python и возвращает результат.

1
2
3
4
print(eval("2 + 3 * 4"))         # => 14
x = 10
print(eval("x > 5"))             # => True
print(eval("[i * 2 for i in range(3)]"))  # => [0, 2, 4]

eval() работает только с выражениями. Инструкции вроде присваивания или import вызовут SyntaxError, для них есть exec():

1
2
exec("y = 5")
print(y)  # => 5

Почему eval() опасен

eval() выполнит любой код, который придёт в строке. Если строка пришла от пользователя, он может удалить файлы или прочитать секреты:

1
eval("__import__('os').getcwd()")  # выполнится как обычный код

Поэтому eval() не применяют к данным из формы, файла или сети.

Чем заменить

Превратить строку в число, список или словарь безопасно помогает ast.literal_eval(). Он понимает только литералы и не выполняет код:

1
2
3
4
5
import ast

print(ast.literal_eval("[1, 2, 3]"))          # => [1, 2, 3]
print(ast.literal_eval("{'a': 1}"))           # => {'a': 1}
ast.literal_eval("__import__('os')")          # ValueError

Для чисел хватает int() и float(), для JSON — json.loads().

Функции и работу со строками разбирают в бесплатном курсе «Основы Python».

17 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845