Upload
tzu-ping-chung
View
289
Download
0
Tags:
Embed Size (px)
DESCRIPTION
A brief overview of six, a module of “utilities for wrapping between Python 2 and 3,” and cross-version compatibility as a whole.
Citation preview
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
>>> 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 2
>>> text = 'Lorem ipsum' # "Unicode"!>>> isinstance(text, str)!True
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
Python 3
>>> 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
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
>>> lv = {}!>>> exec 'x = 3, y = 4' in {}, lv!>>> with open('foo.txt', 'w') as f:!... print >>f lv['x'], lv['y']!...!>>>
Python 2
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)!...!>>>
class MetaFoo(type):! pass!!
class Foo(object):! __metaclass__ = MetaFoo
Python 2
class MetaFoo(type):! pass!!
class Foo(object, metaclass=MetaFoo):! pass
Python 3
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
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
a_byte_string = 'Lorem ipsum'!
still_bytestr = b'Lorem ipsum' # 2.7!
a_unicode_obj = u'Lorem ipsum'
Python 2
a_unicode_obj = 'Lorem ipsum'!
still_unicode = u'Lorem ipsum' # 3.3+ !
a_byte_string = b'Lorem ipsum'
Python 3
from six import b, u!
a_byte_string = b('Lorem ipsum')!
a_unicode_obj = u('Lorem ipsum')
six
a_unicode_obj = u('Lorem ipsum')
six
Be careful with this on Python 2!
six Python 2 Python 3
b str, bytes (2.7) bytes
uunicode
(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
from itertools import izip!
!
u = raw_input()!
!
for i, v in izip(xrange(len(u)), u):!
print i, v
Python 2
u = input()!
!
for i, v in zip(range(len(u)), u):!
print i, v
Python 3
from six.moves import input, zip, range!
!
u = input()!
!
for i, v in zip(range(len(u)), u):!
print i, v
six
from six.moves import ConfigParser!
!
# This will fail on Python 3!!
parser = ConfigParser.SafeConfigParser()
Caveats
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 Readinghttp://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