Как использовать raw_input в Python 3?
У меня возникла проблема при переходе с Python 2 на Python 3. В Python 2 я использовал команду raw_input()
для получения пользовательского ввода, но при запуске этого кода в Python 3 я получаю ошибку:
NameError: name 'raw_input' is not defined
Как мне правильно получить пользовательский ввод в Python 3?
5 ответ(ов)
Этот код работает как в 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
ведет себя иначе. Это позволяет пользователю вводить данные через стандартный ввод, и выводится приветственное сообщение с введенной строкой.
Решение Тиммермана отлично работает при запуске кода, но если вы не хотите получать ошибки Undefined name
при использовании pyflakes или подобного линтера, вы можете воспользоваться следующим вариантом:
try:
import __builtin__
input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
pass
Такой подход позволяет избежать предупреждений о неопределенных именах, обеспечивая при этом совместимость с различными версиями Python.
Вот фрагмент кода, который я использую в своих скриптах, чтобы запустить их в среде, совместимой с Python 2 и 3:
real_raw_input = vars(__builtins__).get('raw_input', input)
Теперь вы можете использовать real_raw_input
. Хотя этот подход довольно затратен по времени, он короткий и читаемый. Поскольку использование функции ожидания ввода обычно не критично по времени (ожидание ввода), это не так важно.
Теоретически, вы можете даже назначить raw_input
вместо real_raw_input
, но существуют модули, которые проверяют наличие raw_input
и ведут себя соответственно. Лучше оставаться на безопасной стороне.
В вашем коде вы создаете универсальную функцию 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
. Это отличное решение для обеспечения совместимости и универсальности кода.
Скорее всего, это не самое лучшее решение, но прежде чем я сюда пришёл, я просто на скорую руку сделал так, чтобы продолжить работать, не делая перерыв в учёбе.
def raw_input(x):
input(x)
После этого, когда я вызываю raw_input('Введите ваше имя: ')
в скрипте, над которым я работаю, он захватывает ввод так же, как это делает input()
.
Возможно, есть причина не делать так, о которой я ещё не узнал!
Как вернуть ключи словаря в виде списка в Python?
UnicodeDecodeError: Кодек 'charmap' не может декодировать байт X в позиции Y: символ отображается как <неопределённый>
Что такое __pycache__?
Относительные импорты в Python 3
"TypeError: требуется объект, похожий на bytes, а не 'str' при обработке содержимого файла в Python 3"