Post on 13-Jun-2015
description
Opciones para migrar a Python 3
OPCIÓN A
● Migramos el código a Python 3 y nos olvidamos de 2.7 y anteriores– Si te lo puedes permitir, adelante
– Se sincero, no te lo puedes permitir
Opciones para migrar a Python 3
OPCION B
● Mantenemos el código de la 2.7 y con 2to3 o con six generamos el código para Python 3– Lento
– Código generado no pythonico
– No programamos en Python 3
– Aburrido
Existe un truco
● Escribir código que funcione a la vez en 2.x y 3.x es muy muy jodido difícil
● Pero hay un truco...
Soporte de versiones
● Las versiones anteriores a la 2.6 son anecdóticas
● las versiones 3.0, 3.1 y 3.2 se pueden obviar, ya que prácticamente no hay base instalada
● El subconjunto que queda es mucho más fácil de compatibilizar
Unicode
● Las versiones 2.6, 2.7, 3.3 y 3.4 permiten especificar sin ambigüedades los tipos de string: – u'hola' siempre será unicode
– b'hola' será o una string en python 2.x o un bytestring en Python 3.x
Excepciones
● Python 2.6 ya permite la nueva sintaxis de uso de las excepciones:
try: ...except Exception as err: ...
función print
● Desde Python 2.6 podemos hacer una importacion del futuro:
from __future__ import print_function
Y usar print como una función en nuestro código
(El cambio podemos hacerlos con herramientas automáticas como 2to3 o python-modernize)
Decoradores
● Desde Python 2.6 tenemos decoradores, que pueden ser muy útiles para adecuar las interfaces
● Por ejemplo, el cambio del método next() a la función y método __next()__
Ejemplo (1/2)
# Definimos el decorador
if PY2:
def implements_iterator(cls):
cls.next = cls.__next__
del cls.__next__
return cls
else:
implement_iterator = lambda x:x
Ejemplo (2/2)
# Usamos el decorador
@implements_iterator
class MyIterator(object):
def __init__(self):
self.lista = [1, 2, 3]
def __next__(self):
for i in self.lista:
yield i
Hay que escribir un módulo de compatibilidad
● No es tan difícil como puede parecer● Normalmente unas 200 o 300 líneas de código● Proyectos tan importantes como Jinja2, Numpy,
SciPy lo han conseguido
Referencias
Porthing to Python 3 redux, de Armin Ronacherlucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/
How to support both Python 2 and 3, de Ondřej Čertíkondrejcertik.blogspot.com.es/2013/08/how-to-support-both-python-2-and-3.html
Key differences between Python 2.7 and Python 3.x, de Sebastian Rashkasebastianraschka.com/Articles/2014_python_2_3_key_diff.html
Herramientas
Six: Python 2 and 3 Compatibility Library¶pythonhosted.org/six/
Python-modernizegithub.com/mitsuhiko/python-modernize¶
Tox: virtualenv-based automation of test activitiespypi.python.org/pypi/tox
Gracias
● Para dudas, preguntas, sugerencias, insultos (siempre que sea con cierta gracia), etc:
– Juan Ignacio Rodríguez de León
– Email: euribates (at) gmail.com
– Twitter: @jileon