Usando Python 2+3
--------------------
En algunas ocasiones puede ser normal querer desarrollar programas que puedan funcionar en Python 2+ y Python 3+. Imagnate por ejemplo que has credo un mdulo de Python usado por cientos de personas, pero no todos tienen Python 2 o 3. En este caso podras tener dos opciones. La primera sera distribuir dos mdulos, uno para Python 2 y otro para Python 3. La segunda sera modificar tu cdigo para que funcionara con ambas versiones.
En esta seccin vamos a ver algunos de los trucos que puedes usar para que tus programas sean compatibles con ambas versiones.
**Imports del futuro**
El primer y ms importante mtodo es usar los *imports* con ``__future__``. Permite importar funcionalidades de Python 3 en Python 2. Veamos un par de ejemplos:
Por ejemplo, los gestores de contexto o *context managers* se introdujeron en Python 2.6+. Para usarlos en Python 2.5 podras hacer lo siguiente.
.. code:: python
from __future__ import with_statement
Por otro lado, ``print`` fue cambiado a una funcin en Python 3. Si quieres usarlo en Python 2, podras hacer lo siguiente haciendo uso de ``__future__``:
.. code:: python
print
# Salida:
from __future__ import print_function
print(print)
# Salida:
**Gestionando cambios de nombre en los mdulos**
Antes de nada, veamos como podemos importar mdulos en Python. Es muy comn hacerlo de la siguiente manera.
.. code:: python
import foo
# o tambin
from foo import bar
Sabes que otra cosa puedes hacer? Es posible tambin realizar lo siguiente:
.. code:: python
import foo as foo
La funcionalidad es la misma que la anterior, pero es vital para hacer tu programa compatible con Python 2 y Python 3. Ahora examinemos el siguiente cdigo:
.. code:: python
try:
import urllib.request as urllib_request # Para Python 3
except ImportError:
import urllib2 as urllib_request # Para Python 2
Lo primero, estamos realizando los *import* dentro de un ``try/excep`` `lee este post si tienes dudas sobre try o except `__.
Hacemos esto ya que en Python 2 no existe el mdulo ``urllib.request``, por lo que si intentamos importar tendremos un ``ImportError``. La funcionalidad de ``urllib.request`` es proporcionada por ``urllib2`` en Python 2. Por lo tanto, si usamos Python 2 intentaremos importar ``urllib.request`` y como dar un error, importaremos ``urllib2``.
Tambin es importante mencionar el uso de la palabra clase ``as``. Es una forma de asignar un nombre al mdulo importado, en nuestro caso ``urllib_request``. Por lo tanto si realizamos esto, todas las clases y mtodos de ``urllib2`` estarn disponibles con el alias ``urllib_request``.
**Funciones obsoletas de Python 2**
Otra cosa muy importante a tener en cuenta es que hay un total de 12 funciones de Python 2 que han sido eliminadas de Python 3. Es importante asegurarse de que no se usan en Python 2, para hacer que el cdigo sea compatible con Python 3. A continuacin mostramos una forma que nos permite asegurarnos de que estas 12 funciones no son usadas.
.. code:: python
from future.builtins.disabled import *
Ahora cada vez que usas una de las funciones que han sido eliminadas de Python 3, tendrs un error ``NameError`` como el que se muestra a continuacin.
.. code:: python
from future.builtins.disabled import *
apply()
# Salida: NameError: obsolete Python 2 builtin apply is disabled
**Libreras externas (backports)**
Existen algunos paquetes que proporcionan determinadas funcionalidades de Python 3 en Python 2. Tenemos por ejemplo las siguientes:
- enum ``pip install enum34``
- singledispatch ``pip install singledispatch``
- pathlib ``pip install pathlib``
Para ms informacin, te recomendamos `la documentacin oficial de Python
`_ con los pasos que tienes que seguir para hacer tu cdigo Python compatible entre las versiones 2 y 3.