2011-05-03 10 views
16

Me preguntaba si alguien tiene sugerencias para escribir una llamada input() compatible con versiones anteriores para recuperar una ruta de archivo?Llamadas de entrada compatibles con versiones anteriores en Python

En Python 2.x, raw_input funciona bien para la entrada como/ruta/a/archivo. Usar la entrada funciona bien en este caso para 3.x, pero se queja en 2.x debido al comportamiento de evaluación.

Una solución es comprobar la versión de Python y, sobre la base de la versión, ya sea input mapa o raw_input a una nueva función:

if sys.version_info[0] >= 3: 
    get_input = input 
else: 
    get_input = raw_input 

Estoy seguro de que hay una mejor manera de hacer esto sin embargo . ¿Alguien tiene alguna sugerencia?

+4

Si está escribiendo código que se va a ejecutar bajo Python 2 y Python 3 sin usar 2to3, desea que esta: http://pypi.python.org/pypi/six Ya se ha resuelto muchas cosas como esto para usted. También funciona como buen ejemplo de cómo resolver este tipo de problemas (aunque de hecho no lo haga por entrada()). Otras formas de hacer que está utilizando 2to3. Ver http://python3porting.com/strategies.html –

Respuesta

24

Desde la versión Python 2.x de input() es esencialmente inútil, simplemente puede sobrescribir por raw_input:

try: 
    input = raw_input 
except NameError: 
    pass 

En general, no me gustaría tratar de apuntar a código que funciona con ambos, Python 2 .x y 3.x, pero más bien escribe tu código de una manera que funciona en 2.x y obtienes una versión 3.x que funciona usando el script 2to3.

1

La forma en que lo está manejando está bien. Probablemente haya más formas similares de usar el módulo sys, pero solo tenga en cuenta que si su programa está haciendo algo más que trivial con cadenas y archivos, es mejor tener dos versiones de su programa en lugar de tener un python3 compatible con versiones anteriores programa.

4

Este código se enseña ahora en muchos programas de educación y formación de Python.

enseña generalmente juntos:

from __future__ import print_function 
if hasattr(__builtins__, 'raw_input'): 
    input = raw_input 

Primera línea: importa la función Python 3.x print() en Python 2.7 así print() comporta de la misma bajo las dos versiones de Python. Si esto rompe su código debido a llamadas anteriores print "some content", puede dejar esta línea desactivada.

Segunda y tercera líneas: establece Python 2.7 raw_input() a input() para que input() se pueda usar en ambas versiones de Python sin problemas. Esto puede usarse solo si esta es la única solución de compatibilidad que desea incluir en su código.

Hay más importaciones from __future__ disponibles en el sitio Python.org para otros problemas de compatibilidad de idiomas. También hay una biblioteca llamada "seis" que se puede buscar para soluciones de compatibilidad cuando se trata de otros problemas.

0

Mi preferencia es importar la función:

from builtins import input

Aunque, tendrá que instalar la dependencia:

pip install future

Por desgracia, esta dependencia no será notado por el pipreqs herramienta. Por lo tanto, si está creando archivos requirements.txt, deberá agregar la biblioteca futura de forma manual.

Cuestiones relacionadas