Python 3 Compatibility (PyCon 2009)

4,019 views
3,449 views

Published on

This talks takes a look at the various options of migrating to Python 3, and takes up examples of some tricks you can do to make you code run unmodified under both 2.6 and 3.0. Video at http://pycon.blip.tv/file/1949281/

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,019
On SlideShare
0
From Embeds
0
Number of Embeds
67
Actions
Shares
0
Downloads
23
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Python 3 Compatibility (PyCon 2009)

  1. Python 2.6 and 3.0 Compatibility Lennart Regebro http://regebro.wordpress.com/ regebro@gmail.com PyCon 2009, Chicago
  2. Python 3.0 is here!
  3. Python 3 is incompatible
  4. Python 3 is incompatible O RLY?
  5. Python 3 is incompatible Ya, really! O RLY?
  6. Strategies to deal with incompatibility
  7. For applications: Just port to Python 3
  8. 2to3 helps you port
  9. Tests are really helpful
  10. Libraries need to support both Python 2 and Python 3
  11. For most libraries: Develop in Python 2 and run 2to3 for Python 3 support
  12. 2to3 supported development has a significant startup cost
  13. For stable libraries: Just port to Python 3
  14. Platform Extensions/ Plugins/etc.
  15. No Plone user will switch to Python 3 until important extensions are available
  16. Nobody will make the extensions support Python 3 until they themselves move to Python 3
  17. Dead lock
  18. The Zope experience
  19. Zope 3: A complete break
  20. Zope 3.1 etc: No break
  21. Wanted: Gradual upgrade path
  22. First support 2.5 and 2.6, then support 2.6 and 3.0, finally dropping 2.x completely
  23. Python 3 is incompatible Oh, right, I forgot already.
  24. Python 2.6 introduces quite a lot of forward compatibility!
  25. Python 2.5: except Exception, e: Python 3.0: except Exception as e:
  26. Python 2.6: Both works!
  27. Python 2.5: 3/2 == 1 Python 3.0: 3/2 == 1.5
  28. Solutions: 3//2 == 1 from __future__ import division 3/2 == 1.5
  29. Python2.5: print >> file, “bla”, “bla”, “bla”, Python3.0: print(“bla”, “bla”, “bla”, file=file, ending='')
  30. Python 2.6: from __future__ import print_function
  31. Python2.5: u”Üniçodê” Python3.0: “Üniçodê”
  32. Python 2.6: from __future__ import unicode_literals
  33. from __future__ import unicode_literals try: str = unicode except NameError: pass isinstance(type(“Üniçodê”), str)
  34. Python2.5: open('filename', 'r').read() 'A stringn' open('filename', 'rb').read() 'A stringn'
  35. Python3.0: open('filename', 'r').read() 'A stringn' open('filename', 'rb').read() b'A stringn'
  36. Python 2.6: b“A string”[5] == “i” Python 3.0: b“A string”[5] == 105
  37. Solutions for 2.6 and 3.0: bytearray(b”A list of bytes”) bytearray(open(file, “rb”).read())
  38. Python 2.6: >>> bytes(a_byte_array) 'Binary data' Python 3.0: >>> bytes(a_byte_array) b'Binary data'
  39. Python2.5: open(“unicodefile”).read() 'xc3x9cnixc3xa7odxc3xaan' Python3.0: 'Üniçodên'
  40. Solution for 2.6 and 3.0: infile =open(“unicodefile”, “rb”) uni = infile.read().decode(enc)
  41. try: from cStringIO import StringIO except ImportError: from io import StringIO
  42. Python2.5: dict.items()/dict.keys()/dict.values() return lists Python3.0: dict.items()/dict.keys()/dict.values() return views
  43. Python 2.5: foo = bar.keys() foo.sort() Python 2.4 - 3.0: foo = sorted(bar.keys())
  44. Removed: dict.iteritems() dict.itervalues() dict.iterkeys()
  45. Python 2.6 solution: try: iter = d.iteritems() except AttributeError: iter = d.items()
  46. Aaaahhhhh........ Now meta classes make sense
  47. infile = open('something', 'rb') bdata = infile.read() python2.6: pass python 3.0: sdata = bdata.decode()
  48. Python 2.x and 3.0: sdata = str(bdata.decode('ascii'))
  49. Running on both 2.x and 3.0 will mean some ugly hacks no matter if you use 2to3 or not
  50. Using 2to3: Easy to support 2.3, 2.4, 2.5 Few contortions Some setup cost Single branch of code
  51. Separate branches: Easy to support 2.3, 2.4, 2.5 No contortions No setup cost You have to fix all bugs twice
  52. 2.6 and 3.0 support without 2to3: More contortions Low setup cost Single branch of code But, no support for < 2.6
  53. Supporting Python 2.5 or lower and 3.0 without 2to3: Contortion fest! High hack value Lot's of work
  54. So what if you decide to go for 2.6 and 3.0 without 2.6? 1. 2to3 2. Make it run under 3.0 3. Backport to Python 2.6
  55. 2.6 compatible 2to3?
  56. Preparing yourself for 3.0
  57. Already in 2.6: String exceptions are gone “as” and “with” are keywords
  58. Python 2.3: alist.sort(cmp=func) Python 2.4 and later: alist = sorted(alist, key=func)
  59. Use // when you want integer division. Use from __future__ import division already now
  60. Mark binary files with “rb” or “wb”
  61. http://code.google.com/p/python-incompatibility regebro@gmail.com

×