Разница между eval ("input ()") и eval (input ()) в Python - PullRequest
4 голосов
/ 13 марта 2019

Я пробую следующую функцию:

x = eval(input())

Предоставление ввода как 123 и типа x также int, он отлично работает:

In [22]: x=eval(input("enter:"))
enter:123
In [24]: print(type(x))
<class 'int'>

Но при вводе в качестве abcd выдает ошибку:

In [26]: x=eval(input("enter:"))
enter:abcd
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-26-fb0be0584c85> in <module>()
----> 1 x=eval(input("enter:"))

<string> in <module>()

NameError: name 'abcd' is not defined

Также, когда я изменил код на:

x=eval('input()')

Работает нормально:

In [27]: x=eval('input("enter:")')
enter:abcd

In [28]: print(x)
abcd

Но если задано значение 123, тип x будет str вместо int:

In [30]: x=eval('input("enter:")')
enter:123

In [31]: print(type(x))
<class 'str'>

Ответы [ 2 ]

5 голосов
/ 13 марта 2019

eval оценивает кусок кода. input получает строку из пользовательского ввода. Поэтому:

  • eval(input()) оценивает все, что вводит пользователь. Если пользователь вводит 123, результатом будет число, если они введут "foo", это будет строка, если они введут ?wrfs, это вызовет ошибку.

  • eval("input()") вычисляет строку "input()", в результате чего Python выполняет функцию input. Это запрашивает у пользователя строку (и ничего больше), в то время как 123 будет строкой "123", ?wrfs будет строкой "?wrfs", а "foo" будет строкой '"foo"' ( !).

Третья версия, которая может сделать разницу очевидной: eval(eval("input()")) в точности совпадает с eval(input()).

0 голосов
/ 25 марта 2019

Вместо того, чтобы сосредоточиться на разнице между eval(“input()”) и eval(input()), давайте сосредоточимся на их первичном сходстве: вы не должны делать ни одно из них!

Я не знаюОткуда идиома eval(input()) появилась в Python 3, возможно, это неправильное понимание переноса input() пользователями Python 2, которые не научились использовать raw_input() вместо этого, но избегали его!

Правильный ответ в этомСитуация такова: если вы хотите str, выполните:

x = input()

, если вы хотите int, выполните:

x = int(input())

Но прекратите использовать eval() как выповторное открытие вашей программы для всех видов злоупотреблений со стороны потенциального пользователя:

>>> x = eval(input('enter: '))
enter: __import__("os").system("rm *")
>>> 

Не пытайтесь делать это дома!Или работайте!

Если вы хотите ввести постоянные структуры данных Python, вы можете попробовать literal_eval() из модуля ast:

>>> from ast import literal_eval
>>> my_dict = literal_eval(input('enter dict: '))
enter dict: {'a': 1, 'b': 2, 'c': 3}
>>> my_dict
{'a': 1, 'b': 2, 'c': 3}
>>> type(my_dict)
<class 'dict'>
>>>  

Но все же будьте осторожны!

...