2 × 3 = 6

819 views
401 views

Published on

A brief overview of six, a module of “utilities for wrapping between Python 2 and 3,” and cross-version compatibility as a whole.

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

  • Be the first to like this

No Downloads
Views
Total views
819
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2 × 3 = 6

  1. 1. 2×3=6
  2. 2. six • Utilities for wrapping between Python 2 and 3 • Multiplication is more powerful • “Five” has already been snatched away by the Zope Five project http://pythonhosted.org/six/
  3. 3. Use Case: Reflection
  4. 4. Python 2 >>> text = 'Lorem ipsum'! >>> isinstance(text, str)! True
  5. 5. Python 2 >>> text = u'Lorem ipsum'! >>> isinstance(text, str)! False
  6. 6. Python 2 >>> text = u'Lorem ipsum'! >>> isinstance(text, str)! False! >>> isinstance(text, unicode)! True
  7. 7. Python 2 >>> text1 = 'Lorem ipsum'! >>> text2 = u'Lorem ipsum'! >>> isinstance(text1, (str, unicode))! True! >>> isinstance(text2, (str, unicode))! True
  8. 8. Python 2 >>> text1 = 'Lorem ipsum'! >>> text2 = u'Lorem ipsum'! >>> isinstance(text1, basestring)! True! >>> isinstance(text2, basestring)! True
  9. 9. Python 3 >>> text = 'Lorem ipsum' >>> isinstance(text, str)! True # "Unicode"!
  10. 10. Python 3 >>> text = u'Lorem ipsum' ! # Python 3.3+! ! >>> isinstance(text, unicode)! Traceback (most recent call last):! File "<stdin>", line 2, in <module>! NameError: name 'unicode' is not defined
  11. 11. Python 3 >>> text = 'Lorem ipsum'! >>> isinstance(text, basestring)! Traceback (most recent call last):! File "<stdin>", line 2, in <module>! NameError: name 'basestring' is not defined
  12. 12. six >>> import six! >>> text = 'Lorem ipsum'! >>> isinstance(text, six.string_types)! True! >>> text = u'Lorem ipsum' # Python 3.3+! >>> isinstance(text, six.string_types)! True
  13. 13. six Python 2 Python 3 class_types type, types.ClassType type integer_types long, int int string_types basestring str text_type unicode str binary_type str, bytes (2.7) bytes MAXSIZE sys.maxsize (2.6+) sys.maxsize
  14. 14. Use Case: Syntax Compatibility
  15. 15. Python 2 >>> lv = {}! >>> exec 'x = 3, y = 4' in {}, lv! >>> with open('foo.txt', 'w') as f:! ... print >>f lv['x'], lv['y']! ...! >>>
  16. 16. Python 3 >>> lv = {}! >>> exec('x = 3, y = 4', {}, lv)! >>> with open('foo.txt', 'w') as f:! ... print(lv['x'], lv['y'], file=f)! ...! >>>
  17. 17. six >>> from six import exec_, print_! >>> lv = {}! >>> exec_('x = 3, y = 4', {}, lv)! >>> with open('foo.txt', 'w') as f:! ... print_(lv['x'], lv['y'], file=f)! ...! >>>
  18. 18. Python 2 class MetaFoo(type):! pass! ! class Foo(object):! __metaclass__ = MetaFoo
  19. 19. Python 3 class MetaFoo(type):! pass! ! class Foo(object, metaclass=MetaFoo):! pass
  20. 20. six from six import add_metaclass! ! class MetaFoo(type):! pass! ! @add_metaclass(MetaFoo)! class Foo(object):! pass
  21. 21. six from six import with_metaclass! ! class MetaFoo(type):! pass! ! class Foo(with_metaclass(object, MetaFoo)):! pass
  22. 22. six Python 2 Python 3 exec_ exec (statement) exec (function) print_ print (statement) print (function) reraise exception re-raising (can contain previous tracebacks) with_metaclass metaclassing (creates an intermediate class) add_metaclass metaclassing (no intermediate class)
  23. 23. Use Case: Texts
  24. 24. Python 2 a_byte_string = 'Lorem ipsum'! still_bytestr = b'Lorem ipsum' a_unicode_obj = u'Lorem ipsum' # 2.7!
  25. 25. Python 3 a_unicode_obj = 'Lorem ipsum'! still_unicode = u'Lorem ipsum' a_byte_string = b'Lorem ipsum' # 3.3+ !
  26. 26. six from six import b, u! a_byte_string = b('Lorem ipsum')! a_unicode_obj = u('Lorem ipsum')
  27. 27. six a_unicode_obj = u('Lorem ipsum') Be careful with this on Python 2!
  28. 28. six Python 2 Python 3 b str, bytes (2.7) bytes u unicode (allows escaping) str unichr unichr chr int2byte chr bytes([integer]) byte2int ord(bytestr[0]) bytestr[0]
  29. 29. six Python 2 Python 3 indexbytes(buf, i) ord(buf[i]) buf[i] iterbytes(buf) an iterator for a bytes instance buf StringIO StringIO.StringIO io.StringIO BytesIO StringIO.StringIO io.BytesIO
  30. 30. Use Case: Name Changes
  31. 31. Python 2 from itertools import izip! ! u = raw_input()! ! for i, v in izip(xrange(len(u)), u):! print i, v
  32. 32. Python 3 u = input()! ! for i, v in zip(range(len(u)), u):! print i, v
  33. 33. six from six.moves import input, zip, range! ! u = input()! ! for i, v in zip(range(len(u)), u):! print i, v
  34. 34. Caveats from six.moves import ConfigParser! ! # This will fail on Python 3!! parser = ConfigParser.SafeConfigParser()
  35. 35. Read the Doc (Too many to list) http://pythonhosted.org/six/#module-six.moves
  36. 36. Advanced Usage • Customised renames • Object model compatibility • six.PY2 and six.PY3 (when all others fail)
  37. 37. In the Meantime • pies • Supports 2.6+ only (six supports 2.4+) • Lightweight • python-future • Based on six • Let you write in pure Python 3
  38. 38. Related Reading http://pythonhosted.org/six/ http://python3porting.com/differences.html http://docs.python.org/3/library/ http://docs.python.org/2/library/ http://python-future.org https://github.com/timothycrosley/pies

×