2 × 3 = 6
Upcoming SlideShare
Loading in...5
×
 

2 × 3 = 6

on

  • 290 views

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

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

Statistics

Views

Total Views
290
Views on SlideShare
290
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

2 × 3 = 6 2 × 3 = 6 Presentation Transcript

  • 2×3=6
  • 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/
  • Use Case: Reflection
  • Python 2 >>> text = 'Lorem ipsum'! >>> isinstance(text, str)! True
  • Python 2 >>> text = u'Lorem ipsum'! >>> isinstance(text, str)! False
  • Python 2 >>> text = u'Lorem ipsum'! >>> isinstance(text, str)! False! >>> isinstance(text, unicode)! True
  • Python 2 >>> text1 = 'Lorem ipsum'! >>> text2 = u'Lorem ipsum'! >>> isinstance(text1, (str, unicode))! True! >>> isinstance(text2, (str, unicode))! True
  • Python 2 >>> text1 = 'Lorem ipsum'! >>> text2 = u'Lorem ipsum'! >>> isinstance(text1, basestring)! True! >>> isinstance(text2, basestring)! True
  • Python 3 >>> text = 'Lorem ipsum' >>> isinstance(text, str)! True # "Unicode"!
  • 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
  • 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
  • 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
  • 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
  • Use Case: Syntax Compatibility
  • Python 2 >>> lv = {}! >>> exec 'x = 3, y = 4' in {}, lv! >>> with open('foo.txt', 'w') as f:! ... print >>f lv['x'], lv['y']! ...! >>>
  • Python 3 >>> lv = {}! >>> exec('x = 3, y = 4', {}, lv)! >>> with open('foo.txt', 'w') as f:! ... print(lv['x'], lv['y'], file=f)! ...! >>>
  • 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)! ...! >>>
  • Python 2 class MetaFoo(type):! pass! ! class Foo(object):! __metaclass__ = MetaFoo
  • Python 3 class MetaFoo(type):! pass! ! class Foo(object, metaclass=MetaFoo):! pass
  • six from six import add_metaclass! ! class MetaFoo(type):! pass! ! @add_metaclass(MetaFoo)! class Foo(object):! pass
  • six from six import with_metaclass! ! class MetaFoo(type):! pass! ! class Foo(with_metaclass(object, MetaFoo)):! pass
  • 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)
  • Use Case: Texts
  • Python 2 a_byte_string = 'Lorem ipsum'! still_bytestr = b'Lorem ipsum' a_unicode_obj = u'Lorem ipsum' # 2.7!
  • Python 3 a_unicode_obj = 'Lorem ipsum'! still_unicode = u'Lorem ipsum' a_byte_string = b'Lorem ipsum' # 3.3+ !
  • six from six import b, u! a_byte_string = b('Lorem ipsum')! a_unicode_obj = u('Lorem ipsum')
  • six a_unicode_obj = u('Lorem ipsum') Be careful with this on Python 2!
  • 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]
  • 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
  • Use Case: Name Changes
  • Python 2 from itertools import izip! ! u = raw_input()! ! for i, v in izip(xrange(len(u)), u):! print i, v
  • Python 3 u = input()! ! for i, v in zip(range(len(u)), u):! print i, v
  • six from six.moves import input, zip, range! ! u = input()! ! for i, v in zip(range(len(u)), u):! print i, v
  • Caveats from six.moves import ConfigParser! ! # This will fail on Python 3!! parser = ConfigParser.SafeConfigParser()
  • Read the Doc (Too many to list) http://pythonhosted.org/six/#module-six.moves
  • Advanced Usage • Customised renames • Object model compatibility • six.PY2 and six.PY3 (when all others fail)
  • 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
  • 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