Escribir código Python 2.7 que sea lo más cercano posible a la syntax de Python 3.x

Dado que Django aún no es compatible con Python 3.x, estoy usando Python 2.7. Sin embargo, me gustaría continuar y familiarizarme con la nueva syntax de Python 3.x tanto como sea posible. Lo que me lleva a la pregunta:

  • ¿Cuál es la mejor manera de escribir código de Python 2.7 que sea lo más compatible posible con Python 3.x?

Sé que correr python -3 hará

Advierta sobre las incompatibilidades de Python 3.x que 2to3 no puede solucionar de forma trivial.

Sin embargo, estoy interesado en acostumbrarme a la syntax de Python 3.x mientras utilizo Python 2.7.

Por ejemplo, parece que debería usar las siguientes importaciones a mi código:

 from __future__ import print_function from __future__ import unicode_literals from __future__ import division from __future__ import absolute_import 

Las cuatro declaraciones de __future__ import anteriores se requieren a partir de Python 3.0, pero no se requieren en 2.7 como se describe en la documentación de Python 2.7.3 27.11. Definiciones de declaraciones futuras

¿Qué más?

Muchos módulos en estos días se reescriben de una manera que permite la ejecución tanto en Python 2 como en Python 3. Esto no es muy difícil en absoluto, y en el futuro será muy fácil simplemente abandonar el soporte de Python 2.

Eche un vistazo a los seis módulos que ayudan con esta tarea, encapsulando muchas de las diferencias de una manera conveniente:

Six proporciona utilidades simples para ajustar las diferencias entre Python 2 y Python 3.

Su sitio web (y, por supuesto, el código) enumera muchas maneras de hacer esto posible.

Coloque el siguiente código en un módulo py3k.py e impórtelo de esta manera: from py3k import * . Sin embargo, debe ponerlo en cada archivo, pero incluso puede dejarlo allí si ya nadie usa Python 2.x, o simplemente puede buscar y reemplazar la línea de importación con espacios en blanco y luego eliminar el archivo.

 try: from future_builtins import * except ImportError: pass try: input = raw_input range = xrange except NameError: pass 

Y así es como se ve mi archivo de plantilla:

 #!/usr/bin/env python # -*- coding: utf-8 -*- """ """ from __future__ import division, absolute_import, \ print_function, unicode_literals from utils.py3k import * # @UnusedWildImport # 

También necesita utilizar las nuevas syntax de excepción, es decir, no más

 try: raise Exception, "Message" except Exception, e: pass 

en su lugar deberías hacer:

 try: raise Exception("Message") except Exception as e: pass 

También asegúrate de prefijar todas tus cadenas binarias con ab, es decir:

b’Esta es una cadena binaria ‘

Para obtener una cubierta más completa de este tema, visite http://python3porting.com/noconv.html

Muchos IDE de Python pueden ser de gran ayuda aquí.

PyCharm , por ejemplo, puede configurarse para verificar la compatibilidad con cualquier rango de versiones,

introduzca la descripción de la imagen aquí

y reportar problemas en cualquier nivel de severidad:

introduzca la descripción de la imagen aquí

 try: input = raw_input range = xrange except NameError: pass 

Son dos los que vienen a la mente …

Te propongo que pruebes la futura biblioteca . Desde su sitio:

python-future es la capa de compatibilidad que falta entre Python 2 y Python 3. Le permite usar un solo código limpio compatible con Python 3.x para admitir Python 2 y Python 3 con una sobrecarga mínima.

Proporciona paquetes futuros y pasados ​​con backports y puertos de funciones de Python 3 y 2. También viene con futurizar y pasteurizar, scripts personalizados basados ​​en 2to3 que le ayudan a convertir código Py2 o Py3 fácilmente para admitir Python 2 y 3 en una base de código Py3-style limpia, módulo por módulo.

Los proyectos notables que usan python-future para la compatibilidad con Python 2/3 son Mezzanine y ObsPy.

Evitar el range() y zip() , usando xrange() e itertools.izip() lugar.