2016-11-15 7 views
3

В 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()?

Ссылки:

+2

IMHO, основная мотивация заключалась в том, чтобы обеспечить прямой ввод данных в стиле Python (числа, списки, dicts). – Leon

+2

[Этот парень] (http://stackoverflow.com/users/818274/guido-van-rossum) здесь может устранить любые недоразумения в отношении дизайнерских решений :-) –

+4

Было удобно, было раннее, и люди не были думать долго и упорно о проблемах безопасности в то время. По той же причине, что C «получил». – user2357112

ответ

4

Прежде всего, возможно, единственный человек, который может ответить на этот вопрос решительно, - the BDFL.

input может быть полезен в программах, предназначенных для использования программистом, чтобы они могли вводить сложные структуры, например {'foo': 42}, или даже выражения, но в меньшей степени в программах, предназначенных для использования неквалифицированным пользователем.

Из истории SCM мы можем видеть, что оба input и raw_inputwere present in 1990; or pre-0.9, когда Python был в зачаточном состоянии - тогда exec была функция, и int('42') бросили бы исключение. В частности, eval уже присутствовал, поэтому можно было использовать eval(raw_input()) даже тогда, чтобы получить тот же эффект.

В то время не было Zen of Python, и «только один очевидный путь» был не столько руководящим принципом, что это могло быть надзором.

И оба raw_input и input остались. Во время истории Python обратная совместимость была руководящим принципом, поэтому input не изменился до тех пор, пока не будет выпущен несовместимый Python 3.


Что касается Bolded части о readline модуле: если импортировать readline, то вы можете использовать клавиши со стрелками для перемещения курсора клавиши вокруг на input() линии, и конфигурируемые привязки; если readline не импортируется в программу, тогда такого поведения не существует.

Опять же, это не было причиной для input, существующей в первую очередь; Еще в 1990 году Python не поддерживал такое редактирование вообще, независимо от того, использовался ли input или raw_input.

1

Для чего это Вортс, input там был встроенный в первый доступный Python версии (0.9.1), это с 1991 года. Я могу представить себе, что Python 2.x имел его для обратной совместимости с Python 1.x, а Python 1.x имел обратную совместимость с 0.x.

Скажите «нет» 0.x -> 1.x и 1.x -> 2.x вопросы портирования!

+0

Так почему это было в 0.9.1? Это ничего не разъясняет. – TigerhawkT3

+0

Вопрос в том, почему это в Python 2, я отвечаю на него. –

+2

Вопрос был довольно явно «почему« input() »был создан или необходим в первую очередь». Иногда, технически правильное, не лучший из правильных. Вы действительно думаете, что этот ответ удовлетворит _anyone_? Честно? – TigerhawkT3