Полезно ли когда-либо использовать вход Python вместо raw_input? - PullRequest
31 голосов
/ 10 октября 2011

В настоящее время я преподаю студентам первого курса Python, и я с удивлением узнал, что, казалось бы, безобидная функция input, которую некоторые из моих студентов решили использовать (и были смущены странным поведением), скрывала вызовна eval позади него.

Итак, мой вопрос: почему функция input вызывает eval, и что бы это было полезно для того, чтобы не было безопаснее делать с * 1007?*?Я понимаю, что это было изменено в Python 3, но в первую очередь это выглядит как необычное дизайнерское решение.

Документация по функциям ввода Python 2.x

Ответы [ 4 ]

38 голосов
/ 10 октября 2011

Полезно ли когда-либо использовать вход Python 2 вместо raw_input?

номер


input() оценивает код, который дает пользователь. Он предоставляет всю мощь Python в руки пользователя. С помощью выражений генератора / списочных представлений, __import__ и операторов if/else буквально все, что может сделать Python, может быть достигнуто с помощью одного выражения. Вредоносные пользователи могут использовать input() для удаления файлов (__import__('os').remove('precious_file')), monkeypatch остальной части программы (setattr(__import__('__main__'), 'function', lambda:42)), ... что угодно.

Обычному пользователю не нужно использовать все расширенные функции. Если вам не нужны выражения, используйте ast.literal_eval(raw_input()) - функция literal_eval безопасна.

Если вы пишете для опытных пользователей, дайте им лучший способ ввода кода. Плагины, пользовательские модули и т. Д. - с полным синтаксисом Python, а не только с функциональностью.

Если вы абсолютно уверены, что знаете, что делаете, скажите eval(raw_input()). eval кричит "Я опасен!" на тренированный глаз. Но, скорее всего, вам это никогда не понадобится.


input() была одной из старых ошибок проектирования, которые исправляет Python 3.

7 голосов
/ 10 октября 2011

Python Input функция возвращает объект, который является результатом вычисления выражения.Функция raw_input возвращает строку

name = "Arthur"
age = 45

first = raw_input("Please enter your age ")
second = input("Please enter your age again ")

# first will always contain a string

# second could contain any object and you can even
# type in a calculation and use "name" and "age" as
# you enter it at run time ...

print "You said you are",first
print "Then you said you are",second

примеры выполнения:

Пример: 1

Prompt$ python yraw 
Please enter your age 45 
Please enter your age again 45 
You said you are 45 Then you said you are 45

Пример: 2

Prompt$ python yraw
Please enter your age 45 + 7
Please enter your age again 45 + 7
You said you are 45 + 7 Then you said you are 52 
Prompt$

Q.почему функция ввода вызывает eval?

A.Рассмотрим сценарий, когда пользователь вводит выражение «45 + 7» во вводе, ввод даст правильный результат по сравнению с raw_input в python 2.x

4 голосов
/ 10 октября 2011

input в значительной степени полезен только в качестве строительного блока для интерактивной оболочки Python.Вы, конечно, правы, что удивительно, что он работает так, как работает, и слишком специфичен для конкретной цели, чтобы быть встроенным - я полагаю, именно поэтому он был удален из Python 3.

2 голосов
/ 04 августа 2015

raw_input лучше, всегда возвращает ввод пользователя без изменений. И наоборот, функция input() попытается преобразовать введенные вами данные, как если бы они были кодом Python, и у нее есть проблемы с безопасностью, поэтому вам следует избегать этого.

В реальной программе не используйте input(). Анализируйте входные данные с помощью чего-то, что обрабатывает ожидаемый формат ввода, а не оценивая ввод как код Python.

...