print - Uso de input/raw_input en python 2 y 3
python input() (6)
Esta pregunta ya tiene una respuesta aquí:
Me gustaría establecer un indicador de usuario con la siguiente pregunta:
save_flag is not set to 1; data will not be saved. Press enter to continue.
input()
funciona en python3 pero no en python2. raw_input()
funciona en python2 pero no en python3. ¿Hay alguna manera de hacer esto para que el código sea compatible tanto con python 2 como con python 3?
Actualización: este método solo funciona si tiene instalado el futuro y las respuestas anteriores son mucho mejores y más generalizables.
De esta hoja de trucos hay otro método que se ve más limpio:
# Python 2 and 3:
from builtins import input
Carga explícitamente la función:
from builtins import input
Luego puede usar input()
en python2 y python3.
Puede que tenga que instalar la dependencia:
pip install future
Creo que la mejor manera de hacerlo es
import six
six.moves.input()
... funcionará en 2 y 3.
Enlazar raw_input
para input
en Python 2:
try:
input = raw_input
except NameError:
pass
Ahora la input
también devolverá una cadena en Python 2.
Si está utilizando six
para escribir el código 2/3 compatible, entonces six.input()
apunta a raw_input()
en Python 2 y input()
en Python 3.
Esto es porque, en python 2, raw_input()
acepta todo lo dado a stdin, como una cadena, donde como input()
preserva el tipo de datos del argumento dado (es decir, si el argumento dado es de tipo int
, entonces permanecerá como int
solo, pero no se convertirá en string
como en el caso de raw_input()
). Básicamente, cuando se utiliza input()
, toma los argumentos proporcionados en stdin como cadena y los evalúa. Y esta evaluación convierte el argumento al tipo correspondiente.
# 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''>
>>>
Por lo tanto, al usar input()
en Python 2, el usuario debe tener cuidado al pasar los argumentos. Si está pasando una cadena, debe pasarla con comillas (ya que Python reconoce los caracteres dentro de la comilla como una cadena). Else NameError
se 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''
Mientras que, si usa raw_input()
, no necesita preocuparse por el tipo de datos mientras pasa el argumento como todo lo que acepta como una cadena. Pero sí, dentro de tu código debes ocuparte de la conversión de tipo apropiada.
Para evitar este cuidado adicional necesario para input()
en Python 2, se ha eliminado en Python 3. Y raw_input()
ha cambiado de nombre a input()
en Python 3. La funcionalidad de input()
de Python 2 ya no está en Python 3. input()
en Python 3 sirve lo que raw_input()
estaba sirviendo en Python 2.
Esta publicación puede ser útil para una comprensión detallada.
Puedes escribir tu código en python2 y usar futurize o en python3 y usar pasteurize . Esto elimina la complejidad de pensar sobre códigos compatibles y garantiza buenas prácticas.
En relación con esta pregunta específica
from builtins import input
Es exactamente lo que producen los scripts anteriores.