В Python 2 было два способа ввода ввода. raw_input()
и input()
, который был оберткой вокруг eval(raw_input())
. В Python 3, однако, input()
заменил raw_input()
, а старое измерение input()
было устаревшим. Это отражено в What's new in Python 3:Какова была причина создания input() в Python 2?
PEP 3111:
raw_input()
был переименован вinput()
. То есть новая функцияinput()
считывает строку изsys.stdin
и возвращает ее с завершающей новой линией. Он поднимаетEOFError
, если вход прекращается досрочно. Чтобы получить старое поведениеinput()
, используйтеeval(input())
.
Но почему именно было input()
вокруг в Python 2 в первую очередь? Каково было обоснование того, что пользовательский ввод был оценен как буквальный код Python 2? Это то, что документация Python 2 должен был сказать:
[
input()
это] Эквивалентeval(raw_input(prompt))
.Эта функция не вызывает ошибок пользователя. Если вход не является синтаксически действительным, будет поднят
SyntaxError
. Другие исключения могут быть подняты, если во время оценки есть ошибка.Если был загружен модуль
readline
, тоinput()
будет использовать его, чтобы обеспечить сложные редактирования строки и истории функции.Рассмотрите возможность использования функции
raw_input()
для общего ввода от пользователей.
Обратите внимание на часть, выделенную полужирным шрифтом (подчеркнуто мной). Что именно это значит? I looked over the documentation for the readline
module и нашел несколько вещей. Единственное реальное отношение немного я нашел, однако, это:
Настройки с использованием этого модуля влияют на поведение как интерактивном режиме интерпретатора и подсказкам, предлагаемых
raw_input()
иinput()
встроенных функций.
Это не помогло объяснить, почему input()
был создан или необходим, в первую очередь.
Излишне говорить, что использование eval(any_user_input())
очень опасно для безопасности, может вызвать трудности с отладкой, и, из того, что я прочитал, работает медленно. Так почему же они создали input()
в Python 2 в первую очередь? Были ли разработчики не осознавать во время сбоев input()
?
Ссылки:
- Is using eval in Python a bad practice?
- eval(input()) in python 2to3
- What’s New In Python 3.0
- Python 2.7.12 documentation
IMHO, основная мотивация заключалась в том, чтобы обеспечить прямой ввод данных в стиле Python (числа, списки, dicts). – Leon
[Этот парень] (http://stackoverflow.com/users/818274/guido-van-rossum) здесь может устранить любые недоразумения в отношении дизайнерских решений :-) –
Было удобно, было раннее, и люди не были думать долго и упорно о проблемах безопасности в то время. По той же причине, что C «получил». – user2357112