Использование ввода /raw _input в python 2 и 3
Я хотел бы задать приглашение пользователя со следующим вопросом:
save_flag is not set to 1; data will not be saved. Press enter to continue.
input()
работает в python3, но не python2. raw_input()
работает в python2, но не python3. Есть ли способ сделать это, чтобы код был совместим как с python 2, так и с python 3?
Ответы
Ответ 1
Привязать raw_input
к input
в Python 2:
try:
input = raw_input
except NameError:
pass
Теперь input
также вернет строку в Python 2.
Если вы используете six
для записи 2/3 совместимого кода, тогда six.input()
указывает на raw_input()
в Python 2 и input()
в Python 3.
Ответ 2
Обновление: этот метод работает только в том случае, если у вас установлено будущее, а ответы выше намного лучше и более обобщаемы.
Из этот чит-лист существует другой метод, который выглядит более чистым:
# Python 2 and 3:
from builtins import input
Ответ 3
Явно загрузите функцию:
from builtins import input
Затем вы можете использовать input()
в python2, а также python3.
Возможно, вам придется установить зависимость:
pip install future
Ответ 4
Я думаю, что лучший способ сделать это -
import six
six.moves.input()
... он будет работать через 2 и 3.
Ответ 5
Это связано с тем, что в python 2 raw_input()
принимает все, что указано в stdin, как строку, где as input()
сохраняет тип данных данного аргумента (т.е. если данный аргумент имеет тип int
, то он останется только int
, но не будет преобразован в string
, как в случае raw_input()
). Это в основном, когда используется input()
, он принимает аргументы, представленные в stdin как строку, и оценивает то же самое. И эта оценка преобразует аргумент в соответствующий тип.
# Python 2.7.6
>>> a = raw_input("enter :- ")
enter :- 3
>>> type(a) # raw_input() converts your int to string
<type 'str'>
>>> a = input("enter :- ")
enter :- 3
>>> type(a) # input() preserves the original type, no conversion
<type 'int'>
>>>
Следовательно, при использовании input()
в Python 2 пользователь должен быть осторожным при передаче аргументов. Если вы передаете строку, вам нужно передать ее с цитатой (поскольку python распознает символы внутри цитаты как строки). Осталось NameError
.
>>> a = input("enter name :- ")
enter name :- Derrick
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'Derrick' is not defined
>>> a = input("enter name :- ")
enter name :- 'Derrick'
>>> a
'Derrick'
В то время как при использовании raw_input()
вам не нужно беспокоиться о типе данных, передавая аргумент как все, что он принимает как строку. Но да, внутри вашего кода вам нужно позаботиться о соответствующем преобразовании типов.
Чтобы избежать этой дополнительной осторожности, необходимой для input()
в Python 2, она была удалена в Python 3. И raw_input()
был переименован в input()
в Python 3. Функцией input()
из Python 2 является не более в Python 3. input()
в Python 3 служит для того, что raw_input()
служил в Python 2.
Этот пост может быть полезен для подробного понимания.
Ответ 6
Вы можете написать свой код в python2 и использовать futurize или в python3 и использовать pasteurize.
Это устраняет сложность мышления о совместимом коде и гарантирует хорошие практики.
Относительно этого конкретного вопроса
from builtins import input
Это именно то, что производят вышеприведенные скрипты.