6

Как использовать raw_input в Python 3?

1

У меня возникла проблема при переходе с Python 2 на Python 3. В Python 2 я использовал команду raw_input() для получения пользовательского ввода, но при запуске этого кода в Python 3 я получаю ошибку:

NameError: name 'raw_input' is not defined

Как мне правильно получить пользовательский ввод в Python 3?

5 ответ(ов)

1

Этот код работает как в Python 3.x, так и в 2.x:

# Устранение проблемы с Python 2.x.
try: 
    input = raw_input
except NameError: 
    pass
print("Привет " + input("Скажи что-нибудь: "))

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

0

Решение Тиммермана отлично работает при запуске кода, но если вы не хотите получать ошибки Undefined name при использовании pyflakes или подобного линтера, вы можете воспользоваться следующим вариантом:

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass

Такой подход позволяет избежать предупреждений о неопределенных именах, обеспечивая при этом совместимость с различными версиями Python.

0

Вот фрагмент кода, который я использую в своих скриптах, чтобы запустить их в среде, совместимой с Python 2 и 3:

real_raw_input = vars(__builtins__).get('raw_input', input)

Теперь вы можете использовать real_raw_input. Хотя этот подход довольно затратен по времени, он короткий и читаемый. Поскольку использование функции ожидания ввода обычно не критично по времени (ожидание ввода), это не так важно.

Теоретически, вы можете даже назначить raw_input вместо real_raw_input, но существуют модули, которые проверяют наличие raw_input и ведут себя соответственно. Лучше оставаться на безопасной стороне.

0

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

# raw_input не определен в Python 3.x, в то время как input не вел себя как raw_input в Python 2.x
# данный код позволяет заставить input и raw_input работать как raw_input из Python 2.x в обеих версиях
try:
    input = raw_input  # В Python 2.x, raw_input определяется, и мы присваиваем его input
except NameError:
    raw_input = input  # В Python 3.x, если raw_input не определен, присваиваем input в raw_input

Таким образом, при выполнении вашего кода в Python 2 будет использован raw_input, а в Python 3 - стандартное поведение input. Это отличное решение для обеспечения совместимости и универсальности кода.

0

Скорее всего, это не самое лучшее решение, но прежде чем я сюда пришёл, я просто на скорую руку сделал так, чтобы продолжить работать, не делая перерыв в учёбе.

def raw_input(x):
    input(x)

После этого, когда я вызываю raw_input('Введите ваше имя: ') в скрипте, над которым я работаю, он захватывает ввод так же, как это делает input().

Возможно, есть причина не делать так, о которой я ещё не узнал!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь