Python 2 input: что нужно знать при вводе данных

Раздел: Python -> Особенности версий Python

В Python 2 функция input() работает иначе, чем в Python 3: она считывает строку из стандартного ввода и сразу выполняет её как выражение Python (аналог eval(raw_input())). Это может быть удобно для быстрого ввода чисел, списков или других литералов, но создаёт серьёзные риски безопасности. Ниже рассмотрены основные подходы к вводу данных, их цели и возможные проблемы.

Основные подходы к вводу данных в Python 2

Как безопасно получить строку от пользователя без риска выполнения кода?

Наиболее эффективное и безопасное решение - использовать функцию raw_input(). Она возвращает введённую строку без какой-либо интерпретации. Последующее преобразование выполняется явно.

# Безопасный ввод имени
name = raw_input("Введите ваше имя: ")
print "Привет, " + name

Python 2 input (функция input() в python 2)

Введите ваше имя: Иван
Привет, Иван

Input python 3 (функция input() в python 3)

Проблема: если пользователь введёт число как строку, то операции над ним как над числом вызовут ошибку. Необходимо преобразовывать ввод.

Как получить целое число, используя raw_input?

age = int(raw_input("Сколько вам лет? "))
print "Вам", age, "лет"
Сколько вам лет? 25
Вам 25 лет

Типичная ошибка: при вводе нечислового значения (например, "двадцать") возникнет ValueError. Рекомендуется использовать обработку исключений.

Как получить число с плавающей точкой и обработать ошибку?

try:
    height = float(raw_input("Введите рост (м): "))
    print "Рост:", height, "м"
except ValueError:
    print "Ошибка: введите число, например 1.75"
Введите рост (м): 1.82
Рост: 1.82 м
Введите рост (м): метр
Ошибка: введите число, например 1.75

Как использовать оригинальный input() для быстрого ввода списка?

# Рискованно, но кратко
numbers = input("Введите список чисел (например, [1,2,3]): ")
print "Сумма:", sum(numbers)
Введите список чисел (например, [1,2,3]): [10, 20, 30]
Сумма: 60

Проблемы: если пользователь введёт __import__('os').system('rm -rf /'), код выполнится. Также возможны синтаксические ошибки при неверном вводе.

Как ввести логическое значение с проверкой?

answer = raw_input("Согласны? (да/нет): ").strip().lower()
if answer in ('да', 'yes', 'y'):
    print "Согласие получено"
else:
    print "Отказ"
Согласны? (да/нет): Да
Согласие получено

Как ввести несколько значений через пробел?

values = raw_input("Введите три числа через пробел: ").split()
a, b, c = map(int, values)
print "Сумма:", a + b + c
Введите три числа через пробел: 5 10 20
Сумма: 35

Ошибка: если введено не 3 числа, возникнет ValueError. Добавьте проверку длины списка.

Дополнительные расширенные примеры работы с вводом в Python 2.

Пример
# Пример ввода списка чисел с проверкой и использованием eval (только для доверенного ввода)
# Внимание: eval опасно, используйте только если уверены во вводе
user_input = raw_input("Введите список чисел в формате [1,2,3]: ")
try:
    data = eval(user_input)
    if isinstance(data, list) and all(isinstance(x, (int, float)) for x in data):
        print "Сумма элементов:", sum(data)
    else:
        print "Ошибка: введите список чисел"
except:
    print "Ошибка: неверный синтаксис"
Введите список чисел в формате [1,2,3]: [4,5,6]
Сумма элементов: 15
Введите список чисел в формате [1,2,3]: abc
Ошибка: неверный синтаксис
Пример
# Ввод нескольких значений с преобразованием и обработкой
# Запрашиваем у пользователя имя, возраст и город
name = raw_input("Ваше имя: ").strip()
try:
    age = int(raw_input("Возраст: "))
except ValueError:
    age = 0
    print "Возраст не распознан, установлено 0"
city = raw_input("Город: ").strip()
print "Привет, %s! Тебе %d лет, ты живёшь в %s." % (name, age, city)
Ваше имя: Елена
Возраст: двадцать пять
Возраст не распознан, установлено 0
Город: Москва
Привет, Елена! Тебе 0 лет, ты живёшь в Москва.
Пример
# Ввод пароля (не отображается) с использованием getpass (в Python 2 отдельный модуль)
import getpass
password = getpass.getpass("Введите пароль: ")
print "Пароль принят (длина: %d)" % len(password)
Введите пароль:
Пароль принят (длина: 8)
Пример
# Ввод с проверкой диапазона чисел
def get_age():
    while True:
        try:
            age = int(raw_input("Введите возраст (0-120): "))
            if 0 <= age <= 120:
                return age
            else:
                print "Возраст вне диапазона"
        except ValueError:
            print "Ошибка: введите целое число"

age = get_age()
print "Ваш возраст:", age
Введите возраст (0-120): 125
Возраст вне диапазона
Введите возраст (0-120): 30
Ваш возраст: 30
Пример
# Ввод с обработкой нескольких ошибок и повторным запросом
choices = ['1', '2', '3']
while True:
    input_str = raw_input("Выберите пункт (1, 2 или 3): ").strip()
    if input_str in choices:
        print "Вы выбрали:", input_str
        break
    else:
        print "Неверный ввод, попробуйте снова"
Выберите пункт (1, 2 или 3): 5
Неверный ввод, попробуйте снова
Выберите пункт (1, 2 или 3): 2
Вы выбрали: 2
Пример
# Использование raw_input с заданием значения по умолчанию
default = "Гость"
name = raw_input("Ваше имя [%s]: " % default).strip()
if not name:
    name = default
print "Привет, " + name
Ваше имя [Гость]: 
Привет, Гость

Функция input() в Python 2 - comments

En
Python 2 input (python)