python ¿2 vs 3?

39
Python ¿2 vs 3? Python ¿2 vs 3? Joel Rivera Joel Rivera [email protected] [email protected] Python Monterrey Python Monterrey www.pymty.org 19 de Febrero de 2015 19 de Febrero de 2015 Python ¿2 vs 3? 1 of 39

Upload: joel-rivera

Post on 19-Jul-2015

403 views

Category:

Software


6 download

TRANSCRIPT

Page 1: Python ¿2 vs 3?

Python ¿2 vs 3?Python ¿2 vs 3?Joel RiveraJoel [email protected]@pymty.org

Python MonterreyPython Monterreywww.pymty.org

19 de Febrero de 201519 de Febrero de 2015

Python ¿2 vs 3?

1 of 39

Page 2: Python ¿2 vs 3?

Pure PythonPure PythonLa platica va orientada a pure Python, con esto quiero decir queno se involucra con el API en C de CPython que también cambió.

Como usuario de bibliotecas en python, solamente notas elefecto de que módulos que usan el API en C tienden a tardarse en

ser portados a Python 3.

Python ¿2 vs 3?

2 of 39

Page 3: Python ¿2 vs 3?

La razónLa razónComo cualquier otro lenguaje que va evolucionando. Pythonllevaba arrastrando un conjunto de características legacy o encontra de la filosofía misma del lenguaje que se va formando

conforme avanza.

Usualmente lo más susceptibles a pagar por esa deuda técnicason core developers, quienes simplemente les quedaba tolerar el

no poder implementar mejoras en la robustés del lenguaje porproblemas de compatibilidad.

Todo lo que se consideraba que no fuese retro-compatible se lesuponía a un futuro lejano llamado Python 3000 o Py3k

La idea se origino cercas del 2001.

Python 3.0 fue liberado el 3 de Diciembre del 2008.

Al día de hoy han pasado cerca de 6 años desde su salida.

Python ¿2 vs 3?

3 of 39

Page 4: Python ¿2 vs 3?

El estado actualEl estado actualUltima versión estable Python 3.4.2

Soporte a Python 3 en bibliotecas populares:

Python 3 Readiness: Python 3 Wall Of Superpowers:

http://py3readiness.org/

https://python3wos.appspot.com/Casi todos los módulos más populares y con desarrollo activo ya

fueron portados a Python 3.

Python 3.3 y superiores agregaron características en el lenguajepara facilitar la retro-compatibilidad con Python 2.7.

Python ¿2 vs 3?

4 of 39

Page 5: Python ¿2 vs 3?

El problemaEl problemaRompieron la regla de oro justo cuando el lenguaje estaba más

que nunca ganando popularidad (2006 - 2010). Por lo que a granparte de la comunidad les pareció de locos.

Y a otros más no les parece razonable pagar el costo dere-escribir cosas por que no ganaban algo significativo (como no

tener un GIL).

Mientras los core developers se regocijaban en su core limpio yorganizado donde podían trabajar más a gusto.

Python ¿2 vs 3?

5 of 39

Page 6: Python ¿2 vs 3?

Algunos de los cambios relevantesAlgunos de los cambios relevantesNombres de módulosClara distinción sobre bytes y strings.La estructura interna de las clases.Cambios sutiles en reflexión, excepciones y metaclases.Una reorganización en general de los módulos en la bibliotecaestándar.

Y lo más importante…

print pasa de ser una palabra reservada a una función.

Al igual que exec pero a ese casi nadie le llora.

Python ¿2 vs 3?

6 of 39

Page 7: Python ¿2 vs 3?

El verdadero problemaEl verdadero problemaPython ¿2 vs 3?

7 of 39

Page 8: Python ¿2 vs 3?

Reescribir códigoReescribir códigoPython ¿2 vs 3?

8 of 39

Page 9: Python ¿2 vs 3?

Implementaciones más limitadasImplementaciones más limitadasPyPy:: soporte experimental para Python 3.Jython:: Apenas está (en beta) con Python 2.7.IronPython:: Solo soporta Python 2.7.

Python ¿2 vs 3?

9 of 39

Page 10: Python ¿2 vs 3?

Disponibilidad de bibliotecasDisponibilidad de bibliotecasNo hay mejor código que el que no se escribe.

Python ¿2 vs 3?

10 of 39

Page 11: Python ¿2 vs 3?

¿Y por que habría de impor-¿Y por que habría de impor-tarme?tarme?

Python 3 es mucho más uniforme.

Python 3 es El futuro del lenguaje.

Si apenas comienzas con el lenguaje conviene que te familiaricescon idiomas modernos y saques provecho a lo más nuevo del

lenguaje.

Python 2 se considera en mantenimiento. Es como Windows XP.

Python ¿2 vs 3?

11 of 39

Page 12: Python ¿2 vs 3?

Estrategías de migraciónEstrategías de migraciónSoportar solamente Python 3.Ramas de desarrollo independientes para 2 y 3.Convertir el código con 2to3.Python 2 y 3 sin conversión.

Python ¿2 vs 3?

12 of 39

Page 13: Python ¿2 vs 3?

Preparando el código.Preparando el código.Python ¿2 vs 3?

13 of 39

Page 14: Python ¿2 vs 3?

Usa Python 2.7.Usa Python 2.7.Python ¿2 vs 3?

14 of 39

Page 15: Python ¿2 vs 3?

Usar // en vez de / para dividir enteros.Usar // en vez de / para dividir enteros.Python ¿2 vs 3?

15 of 39

Page 16: Python ¿2 vs 3?

Al ordenar usa `key` en vez de `cmp`Al ordenar usa `key` en vez de `cmp`Python ¿2 vs 3?

16 of 39

Page 17: Python ¿2 vs 3?

New-style classes.New-style classes.New style:

class Persona(object): def method(self): pass

Old style:class Persona: def method(self): pass

En Python 3, no es necesario heredar de object por lo que es lomismo:

class Persona: ....

que estoclass Persona(object): ....

Pero el segundo es new-style en Python 2 y Python 3.

Python ¿2 vs 3?

17 of 39

Page 18: Python ¿2 vs 3?

Separar datos binarios y cadenas.Separar datos binarios y cadenas.Gran parte de el como hacer esto es dependiendo de la lógica del

programa, por ejemplo al procesar imágenes, no deberían detener un encoding y por lo tanto deben de manipularse y

comportarse como bytes:>>> b'abcd'[0]97

No como cadena:>>> 'abcd'[0]a

Literal byte string:

b'raw bytes'

Literal unicode string: (por compatibilidad se agrego en python3.3)

u'¡San Nicolás!'

Python ¿2 vs 3?

18 of 39

Page 19: Python ¿2 vs 3?

Methodos de comparación.Methodos de comparación.__cmp__ es remplazado por los métodos de comparación más

explícitos:

__lt__<__le__<=__gt__>__ge__>=__eq__==__ne__!=

Python ¿2 vs 3?

19 of 39

Page 20: Python ¿2 vs 3?

Verificar dependencia a módulos que yaVerificar dependencia a módulos que yano existen.no existen.

Python ¿2 vs 3?

20 of 39

Page 21: Python ¿2 vs 3?

Iteradores sobre diccionarios.Iteradores sobre diccionarios.Python ¿2 vs 3?

21 of 39

Page 22: Python ¿2 vs 3?

Reorganización de la bibliotecaReorganización de la bibliotecaestándarestándar

Lo siguiente es un extracto de Porting to Python 3 por LennartRegebro.

No incluye la reestructuración de urllib.

Python ¿2 vs 3?

22 of 39

Page 23: Python ¿2 vs 3?

Parte 1 / 5Parte 1 / 5Python 2 name Python 3 name six nameanydbm dbmBaseHTTPServer http.server BaseHTTPServer__builtin__ builtins builtinsCGIHTTPServer http.server CGIHTTPServerConfigParser configparser configparsercopy_reg copyreg copyregcPickle pickle cPicklecStringIO.StringIO io.StringIO cStringIO

Python ¿2 vs 3?

23 of 39

Page 24: Python ¿2 vs 3?

Parte 2 / 5Parte 2 / 5Python 2 name Python 3 name six nameCookie http.cookies http_cookiescookielib http.cookiejar http_cookiejardbhash dbm.bsddbm dbm.ndbmdumbdb dbm.dumbDialog tkinter.dialog tkinter_dialogDocXMLRPCServer xmlrpc.serverFileDialog tkinter.FileDialog tkinter_filedialogFixTk tkinter._fix

Python ¿2 vs 3?

24 of 39

Page 25: Python ¿2 vs 3?

Parte 3 / 5Parte 3 / 5Python 2 name Python 3 name six namegdbm dbm.gnuhtmlentitydefs html.entities html_entitiesHTMLParser html.parser html_parserhttplib http.client http_clientmarkupbase _markupbaseQueue queue queuerepr reprlib reprlibrobotparser urllib.robotparser urllib_robotparserScrolledText tkinter.scolledtext tkinter_scrolledtextSimpleDialog tkinter.simpledialog tkinter_simpledialog

Python ¿2 vs 3?

25 of 39

Page 26: Python ¿2 vs 3?

Parte 4 / 5Parte 4 / 5Python 2 name Python 3 name six nameSimpleHTTPServer http.server SimpleHTTPServerSimpleXMLRPCServer xmlrpc.serverStringIO.StringIO io.StringIOSocketServer socketserver socketservertest.test_support test.support tkinterTkinter tkinter tkinterTix tkinter.tix tkinter_tixTkconstants tkinter.constants tkinter_constantstkColorChooser tkinter.colorchooser tkinter_colorchooser

Python ¿2 vs 3?

26 of 39

Page 27: Python ¿2 vs 3?

Parte 5 / 5Parte 5 / 5Python 2 name Python 3 name six nametkCommonDialog tkinter.commondialog tkinter_commondialogTkdnd tkinter.dnd tkinter_dndtkFileDialog tkinter.filedialog tkinter_tkfiledialogtkFont tkinter.font tkinter_fonttkMessageBox tkinter.messagebox tkinter_messageboxtkSimpleDialog tkinter.simpledialog tkinter_tksimpledialogturtle tkinter.turtleUserList collectionsUserString collectionswhichdb dbm_winreg winreg winregxmlrpclib xmlrpc.client

Python ¿2 vs 3?

27 of 39

Page 28: Python ¿2 vs 3?

Sobre UnicodeSobre UnicodePython ¿2 vs 3?

28 of 39

Page 29: Python ¿2 vs 3?

Errores comunesErrores comunesCasi todo pythonista en algún momento de su vida le toco algo

así:python LoL_Coding.py File "LoL_Coding.py", line 3SyntaxError: Non-ASCII character '\xc2' in file LoL_Coding.py on line 3, but no encoding declared;

Traceback (most recent call last): File "<stdin>", line 1, in <module>UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)

En especial si lo que programas lee de archivos o red.

Python ¿2 vs 3?

29 of 39

Page 30: Python ¿2 vs 3?

Erroces comunes cont.Erroces comunes cont.La verdad es que es un problema que nos buscamos por no tener

una clara distinción sobre cadenas de caracteres, bytes yencodings.

Que en general se puede resumir a:

bytes + encoding -> caracteres -> encoded string

Python 3 toma una postura mucho más acorde a lo que se esperaen estos años de i18n y de paso te ahorras muchos:

-*- coding: utf-8 -*-

En todos tus archivos.

Python ¿2 vs 3?

30 of 39

Page 31: Python ¿2 vs 3?

El lado obscuroEl lado obscuroDicho lo anterior existen problemas sobre la aproximación de

unicode en Python, es particularmente molesta cuando se lidiacon protocolos con encodings que no están claramente definidos

o se pasa de bytes a cadenas de forma constante.

La critica principal es sobre un soporte a unicode enfocado hacialos principiantes.

Para más información:

http://lucumr.pocoo.org/2014/1/5/unicode-in-2-and-3/http://lucumr.pocoo.org/2014/5/12/everything-about-unicode/

Python ¿2 vs 3?

31 of 39

Page 32: Python ¿2 vs 3?

form __future__ im‐form __future__ im‐port *port *

Como forma de facilitar el portar el código de vesiones anterioresse tienen al alcance las siguientes llamadas a __future__

Carácteristica Opt. Mand. Efectodivision 2.2.0a2 3.0 PEP 238: Changing the

Division Operatorabsolute_import 2.5.0a1 3.0 PEP 328: Imports:

Multi-Line andAbsolute/Relative

print_function 2.6.0a2 3.0 PEP 3105: Make print afunction

unicode_literals 2.6.0a2 3.0 PEP 3112: Bytes literalsin Python 3000

Python ¿2 vs 3?

32 of 39

Page 33: Python ¿2 vs 3?

Mi recomendaciónMi recomendaciónPython ¿2 vs 3?

33 of 39

Page 34: Python ¿2 vs 3?

Proyectos personalesProyectos personalesVerifica tus dependenciasEn caso de que todas soporten python 3 usalo.En caso contrario usa python 2.7 favoreciendo los módulos consoporte a 3.Escribe tú código de Python 2 usando idiomas modernos.

Python ¿2 vs 3?

34 of 39

Page 35: Python ¿2 vs 3?

Distribuir códigoDistribuir códigoSi estar haciendo un módulo para compartir soporta las dosversiones.Empieza con >3.3 o >2.6 teniendo en mente la compatibilidad.Considera usar six para la capa de compatibilidad.

Python ¿2 vs 3?

35 of 39

Page 36: Python ¿2 vs 3?

Cool Python 3 stuffCool Python 3 stuffUnicode por defecto en todas partesasyncioenumipaddressensurepippathlibstatisticstracemallocfaulthandlernolocal

Python ¿2 vs 3?

36 of 39

Page 37: Python ¿2 vs 3?

Cool Python 3 stuff cont.Cool Python 3 stuff cont.selectorsconcurrent.futuresyield [email protected] only argumentstuple unpackinganotacionesMejor instalador en windows

Python ¿2 vs 3?

37 of 39

Page 38: Python ¿2 vs 3?

Recursos y ¿Preguntas?Recursos y ¿Preguntas?Python 3 Readiness: Python 3 Wall Of Superpowers:

Porting to Python 3: Why should OpenStack move to Python 3 right now?:

Unicode in 2 and 3:

Everything about Unicode:

six:

http://py3readiness.org/

https://python3wos.appspot.com/http://python3porting.com/

http://techs.enovance.com/6521/openstack_python3http://lucumr.pocoo.org/2014/1

/5/unicode-in-2-and-3/http://lucumr.pocoo.org/2014/5

/12/everything-about-unicode/https://pypi.python.org/pypi/six

Python ¿2 vs 3?

38 of 39

Page 39: Python ¿2 vs 3?

Recursos y ¿Preguntas? cont.Recursos y ¿Preguntas? cont.__future__:

What's new in Python 3.0:

What's new in Python 3.1:

What's new in Python 3.2:

What's new in Python 3.3:

What's new in Python 3.4:

https://docs.python.org/2/library/__future__.html

https://docs.python.org/dev/whatsnew/3.0.html

https://docs.python.org/dev/whatsnew/3.1.html

https://docs.python.org/dev/whatsnew/3.2.html

https://docs.python.org/dev/whatsnew/3.3.html

https://docs.python.org/dev/whatsnew/3.4.html

Python ¿2 vs 3?

39 of 39