blob: fc08d18a90f20b3e65df802ad647c21b6839b8c9 [file] [log] [blame]
Brett Cannon8045d972011-02-03 22:01:54 +00001.. _pyporting-howto:
2
3*********************************
4Porting Python 2 Code to Python 3
5*********************************
6
7:author: Brett Cannon
8
9.. topic:: Abstract
10
Brett Cannon4b0c24a2011-02-03 22:14:58 +000011 With Python 3 being the future of Python while Python 2 is still in active
12 use, it is good to have your project available for both major releases of
13 Python. This guide is meant to help you choose which strategy works best
14 for your project to support both Python 2 & 3 along with how to execute
15 that strategy.
Brett Cannon8045d972011-02-03 22:01:54 +000016
Brett Cannon4b0c24a2011-02-03 22:14:58 +000017 If you are looking to port an extension module instead of pure Python code,
Éric Araujo5405a0b2011-02-05 16:03:12 +000018 please see :ref:`cporting-howto`.
Brett Cannon8045d972011-02-03 22:01:54 +000019
20
21Choosing a Strategy
22===================
Georg Brandl2cb2fa92011-02-07 15:30:45 +000023
Brett Cannon8045d972011-02-03 22:01:54 +000024When a project makes the decision that it's time to support both Python 2 & 3,
25a decision needs to be made as to how to go about accomplishing that goal.
Eli Bendersky2d062de2011-02-07 04:19:57 +000026The chosen strategy will depend on how large the project's existing
Brett Cannon8045d972011-02-03 22:01:54 +000027codebase is and how much divergence you want from your Python 2 codebase from
28your Python 3 one (e.g., starting a new version with Python 3).
29
30If your project is brand-new or does not have a large codebase, then you may
31want to consider writing/porting :ref:`all of your code for Python 3
32and use 3to2 <use_3to2>` to port your code for Python 2.
33
34If your project has a pre-existing Python 2 codebase and you would like Python
353 support to start off a new branch or version of your project, then you will
Eli Bendersky2d062de2011-02-07 04:19:57 +000036most likely want to :ref:`port using 2to3 <use_2to3>`. This will allow you to
37port your Python 2 code to Python 3 in a semi-automated fashion and begin to
Brett Cannon8045d972011-02-03 22:01:54 +000038maintain it separately from your Python 2 code. This approach can also work if
39your codebase is small and/or simple enough for the translation to occur
40quickly.
41
42Finally, if you want to maintain Python 2 and Python 3 versions of your project
43simultaneously and with no differences, then you can write :ref:`Python 2/3
44source-compatible code <use_same_source>`. While the code is not quite as
45idiomatic as it would be written just for Python 3 or automating the port from
46Python 2, it does makes it easier to continue to do rapid development
47regardless of what major version of Python you are developing against at the
48time.
49
50Regardless of which approach you choose, porting is probably not as hard or
51time-consuming as you might initially think. You can also tackle the problem
52piece-meal as a good portion of porting is simply updating your code to follow
53current best practices in a Python 2/3 compatible way.
54
55
56Universal Bits of Advice
57------------------------
Georg Brandl2cb2fa92011-02-07 15:30:45 +000058
Brett Cannon8045d972011-02-03 22:01:54 +000059Regardless of what strategy you pick, there are a few things you should
60consider.
61
62One is make sure you have a robust test suite. You need to make sure everything
63continues to work, just like when you support a new minor version of Python.
64This means making sure your test suite is thorough and is ported properly
65between Python 2 & 3. You will also most likely want to use something like tox_
66to automate testing between both a Python 2 and Python 3 VM.
67
68Two, once your project has Python 3 support, make sure to add the proper
69classifier on the Cheeseshop_ (PyPI_). To have your project listed as Python 3
70compatible it must have the
71`Python 3 classifier <http://pypi.python.org/pypi?:action=browse&c=533>`_
72(from
73http://techspot.zzzeek.org/2011/01/24/zzzeek-s-guide-to-python-3-porting/)::
74
Brett Cannon4b0c24a2011-02-03 22:14:58 +000075 setup(
76 name='Your Library',
77 version='1.0',
78 classifiers=[
79 # make sure to use :: Python *and* :: Python :: 3 so
80 # that pypi can list the package on the python 3 page
81 'Programming Language :: Python',
82 'Programming Language :: Python :: 3'
83 ],
84 packages=['yourlibrary'],
85 # make sure to add custom_fixers to the MANIFEST.in
86 include_package_data=True,
87 # ...
88 )
Brett Cannon8045d972011-02-03 22:01:54 +000089
90
91Doing so will cause your project to show up in the
92`Python 3 packages list
93<http://pypi.python.org/pypi?:action=browse&c=533&show=all>`_. You will know
94you set the classifier properly as visiting your project page on the Cheeseshop
95will show a Python 3 logo in the upper-left corner of the page.
96
97Three, the six_ project provides a library which helps iron out differences
98between Python 2 & 3. If you find there is a sticky point that is a continual
99point of contention in your translation or maintenance of code, consider using
100a source-compatible solution relying on six. If you have to create your own
101Python 2/3 compatible solution, you can use ``sys.version_info[0] >= 3`` as a
102guard.
103
104Four, read all the approaches. Just because some bit of advice applies to one
105approach more than another doesn't mean that some advice doesn't apply to other
106strategies.
107
Eli Bendersky2d062de2011-02-07 04:19:57 +0000108Five, drop support for older Python versions if possible. `Python 2.5`_
109introduced a lot of useful syntax and libraries which have become idiomatic
110in Python 3. `Python 2.6`_ introduced future statements which makes
111compatibility much easier if you are going from Python 2 to 3.
Brett Cannon8045d972011-02-03 22:01:54 +0000112`Python 2.7`_ continues the trend in the stdlib. So choose the newest version
Eli Bendersky2d062de2011-02-07 04:19:57 +0000113of Python which you believe can be your minimum support version
Brett Cannon8045d972011-02-03 22:01:54 +0000114and work from there.
115
116
117.. _tox: http://codespeak.net/tox/
118.. _Cheeseshop:
119.. _PyPI: http://pypi.python.org/
120.. _six: http://packages.python.org/six
121.. _Python 2.7: http://www.python.org/2.7.x
122.. _Python 2.6: http://www.python.org/2.6.x
123.. _Python 2.5: http://www.python.org/2.5.x
124.. _Python 2.4: http://www.python.org/2.4.x
Brett Cannonce71ab22011-02-05 22:05:05 +0000125.. _Python 2.3: http://www.python.org/2.3.x
126.. _Python 2.2: http://www.python.org/2.2.x
Brett Cannon8045d972011-02-03 22:01:54 +0000127
128
129.. _use_3to2:
130
131Python 3 and 3to2
132=================
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000133
Brett Cannon8045d972011-02-03 22:01:54 +0000134If you are starting a new project or your codebase is small enough, you may
135want to consider writing your code for Python 3 and backporting to Python 2
136using 3to2_. Thanks to Python 3 being more strict about things than Python 2
137(e.g., bytes vs. strings), the source translation can be easier and more
138straightforward than from Python 2 to 3. Plus it gives you more direct
139experience developing in Python 3 which, since it is the future of Python, is a
140good thing long-term.
141
142A drawback of this approach is that 3to2 is a third-party project. This means
143that the Python core developers (and thus this guide) can make no promises
144about how well 3to2 works at any time. There is nothing to suggest, though,
145that 3to2 is not a high-quality project.
146
147
148.. _3to2: https://bitbucket.org/amentajo/lib3to2/overview
149
150
151.. _use_2to3:
152
153Python 2 and 2to3
154=================
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000155
Eli Bendersky7ac34192011-02-07 04:44:19 +0000156Included with Python since 2.6, the 2to3_ tool (and :mod:`lib2to3` module)
157helps with porting Python 2 to Python 3 by performing various source
158translations. This is a perfect solution for projects which wish to branch
159their Python 3 code from their Python 2 codebase and maintain them as
160independent codebases. You can even begin preparing to use this approach
161today by writing future-compatible Python code which works cleanly in
162Python 2 in conjunction with 2to3; all steps outlined below will work
163with Python 2 code up to the point when the actual use of 2to3 occurs.
Brett Cannon8045d972011-02-03 22:01:54 +0000164
165Use of 2to3 as an on-demand translation step at install time is also possible,
166preventing the need to maintain a separate Python 3 codebase, but this approach
167does come with some drawbacks. While users will only have to pay the
168translation cost once at installation, you as a developer will need to pay the
169cost regularly during development. If your codebase is sufficiently large
170enough then the translation step ends up acting like a compilation step,
171robbing you of the rapid development process you are used to with Python.
172Obviously the time required to translate a project will vary, so do an
173experimental translation just to see how long it takes to evaluate whether you
174prefer this approach compared to using :ref:`use_same_source` or simply keeping
175a separate Python 3 codebase.
176
177Below are the typical steps taken by a project which uses a 2to3-based approach
178to supporting Python 2 & 3.
179
180
181Support Python 2.7
182------------------
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000183
Brett Cannon8045d972011-02-03 22:01:54 +0000184As a first step, make sure that your project is compatible with `Python 2.7`_.
185This is just good to do as Python 2.7 is the last release of Python 2 and thus
186will be used for a rather long time. It also allows for use of the ``-3`` flag
187to Python to help discover places in your code which 2to3 cannot handle but are
188known to cause issues.
189
Brett Cannonce71ab22011-02-05 22:05:05 +0000190Try to Support `Python 2.6`_ and Newer Only
191-------------------------------------------
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000192
Brett Cannon8045d972011-02-03 22:01:54 +0000193While not possible for all projects, if you can support `Python 2.6`_ and newer
194**only**, your life will be much easier. Various future statements, stdlib
195additions, etc. exist only in Python 2.6 and later which greatly assist in
196porting to Python 3. But if you project must keep support for `Python 2.5`_ (or
197even `Python 2.4`_) then it is still possible to port to Python 3.
198
199Below are the benefits you gain if you only have to support Python 2.6 and
200newer. Some of these options are personal choice while others are
201**strongly** recommended (the ones that are more for personal choice are
202labeled as such). If you continue to support older versions of Python then you
203at least need to watch out for situations that these solutions fix.
204
205
Brett Cannon8045d972011-02-03 22:01:54 +0000206``from __future__ import print_function``
207'''''''''''''''''''''''''''''''''''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000208
Brett Cannon8045d972011-02-03 22:01:54 +0000209This is a personal choice. 2to3 handles the translation from the print
210statement to the print function rather well so this is an optional step. This
211future statement does help, though, with getting used to typing
212``print('Hello, World')`` instead of ``print 'Hello, World'``.
213
214
215``from __future__ import unicode_literals``
216'''''''''''''''''''''''''''''''''''''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000217
Brett Cannon8045d972011-02-03 22:01:54 +0000218Another personal choice. You can always mark what you want to be a (unicode)
219string with a ``u`` prefix to get the same effect. But regardless of whether
220you use this future statement or not, you **must** make sure you know exactly
221which Python 2 strings you want to be bytes, and which are to be strings. This
222means you should, **at minimum** mark all strings that are meant to be text
223strings with a ``u`` prefix if you do not use this future statement.
224
225
226Bytes literals
227''''''''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000228
Brett Cannon8045d972011-02-03 22:01:54 +0000229This is a **very** important one. The ability to prefix Python 2 strings that
230are meant to contain bytes with a ``b`` prefix help to very clearly delineate
231what is and is not a Python 3 string. When you run 2to3 on code, all Python 2
232strings become Python 3 strings **unless** they are prefixed with ``b``.
233
234There are some differences between byte literals in Python 2 and those in
235Python 3 thanks to the bytes type just being an alias to ``str`` in Python 2.
236Probably the biggest "gotcha" is that indexing results in different values. In
237Python 2, the value of ``b'py'[1]`` is ``'y'``, while in Python 3 it's ``121``.
238You can avoid this disparity by always slicing at the size of a single element:
239``b'py'[1:2]`` is ``'y'`` in Python 2 and ``b'y'`` in Python 3 (i.e., close
240enough).
241
242You cannot concatenate bytes and strings in Python 3. But since in Python
2432 has bytes aliased to ``str``, it will succeed: ``b'a' + u'b'`` works in
244Python 2, but ``b'a' + 'b'`` in Python 3 is a :exc:`TypeError`. A similar issue
245also comes about when doing comparisons between bytes and strings.
246
247
Brett Cannonce71ab22011-02-05 22:05:05 +0000248Supporting `Python 2.5`_ and Newer Only
249---------------------------------------
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000250
Brett Cannonce71ab22011-02-05 22:05:05 +0000251If you are supporting `Python 2.5`_ and newer there are still some features of
252Python that you can utilize.
253
254
255``from __future__ import absolute_imports``
256'''''''''''''''''''''''''''''''''''''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000257
Brett Cannonce71ab22011-02-05 22:05:05 +0000258Implicit relative imports (e.g., importing ``spam.bacon`` from within
259``spam.eggs`` with the statement ``import bacon``) does not work in Python 3.
260This future statement moves away from that and allows the use of explicit
261relative imports (e.g., ``from . import bacon``).
262
263In `Python 2.5`_ you must use
264the __future__ statement to get to use explicit relative imports and prevent
265implicit ones. In `Python 2.6`_ explicit relative imports are available without
266the statement, but you still want the __future__ statement to prevent implicit
267relative imports. In `Python 2.7`_ the __future__ statement is not needed. In
268other words, unless you are only supporting Python 2.7 or a version earlier
269than Python 2.5, use the __future__ statement.
270
271
272
Brett Cannon8045d972011-02-03 22:01:54 +0000273Handle Common "Gotchas"
274-----------------------
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000275
Brett Cannon8045d972011-02-03 22:01:54 +0000276There are a few things that just consistently come up as sticking points for
277people which 2to3 cannot handle automatically or can easily be done in Python 2
278to help modernize your code.
279
280
Brett Cannonce71ab22011-02-05 22:05:05 +0000281``from __future__ import division``
282'''''''''''''''''''''''''''''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000283
Brett Cannonce71ab22011-02-05 22:05:05 +0000284While the exact same outcome can be had by using the ``-Qnew`` argument to
285Python, using this future statement lifts the requirement that your users use
286the flag to get the expected behavior of division in Python 3
287(e.g., ``1/2 == 0.5; 1//2 == 0``).
288
289
290
Antoine Pitrou5c28cfdc2011-02-05 11:53:39 +0000291Specify when opening a file as binary
292'''''''''''''''''''''''''''''''''''''
293
294Unless you have been working on Windows, there is a chance you have not always
295bothered to add the ``b`` mode when opening a binary file (e.g., ``rb`` for
296binary reading). Under Python 3, binary files and text files are clearly
297distinct and mutually incompatible; see the :mod:`io` module for details.
298Therefore, you **must** make a decision of whether a file will be used for
299binary access (allowing to read and/or write bytes data) or text access
300(allowing to read and/or write unicode data).
301
302Text files
303''''''''''
304
305Text files created using ``open()`` under Python 2 return byte strings,
306while under Python 3 they return unicode strings. Depending on your porting
307strategy, this can be an issue.
308
309If you want text files to return unicode strings in Python 2, you have two
310possibilities:
311
312* Under Python 2.6 and higher, use :func:`io.open`. Since :func:`io.open`
313 is essentially the same function in both Python 2 and Python 3, it will
314 help iron out any issues that might arise.
315
316* If pre-2.6 compatibility is needed, then you should use :func:`codecs.open`
317 instead. This will make sure that you get back unicode strings in Python 2.
318
Brett Cannon8045d972011-02-03 22:01:54 +0000319Subclass ``object``
320'''''''''''''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000321
Brett Cannonce71ab22011-02-05 22:05:05 +0000322New-style classes have been around since `Python 2.2`_. You need to make sure
323you are subclassing from ``object`` to avoid odd edge cases involving method
Brett Cannon8045d972011-02-03 22:01:54 +0000324resolution order, etc. This continues to be totally valid in Python 3 (although
325unneeded as all classes implicitly inherit from ``object``).
326
327
328Deal With the Bytes/String Dichotomy
329''''''''''''''''''''''''''''''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000330
Brett Cannon8045d972011-02-03 22:01:54 +0000331One of the biggest issues people have when porting code to Python 3 is handling
332the bytes/string dichotomy. Because Python 2 allowed the ``str`` type to hold
333textual data, people have over the years been rather loose in their delineation
334of what ``str`` instances held text compared to bytes. In Python 3 you cannot
335be so care-free anymore and need to properly handle the difference. The key
336handling this issue to to make sure that **every** string literal in your
337Python 2 code is either syntactically of functionally marked as either bytes or
338text data. After this is done you then need to make sure your APIs are designed
339to either handle a specific type or made to be properly polymorphic.
340
341
342Mark Up Python 2 String Literals
343********************************
344
345First thing you must do is designate every single string literal in Python 2
346as either textual or bytes data. If you are only supporting Python 2.6 or
347newer, this can be accomplished by marking bytes literals with a ``b`` prefix
348and then designating textual data with a ``u`` prefix or using the
349``unicode_literals`` future statement.
350
351If your project supports versions of Python pre-dating 2.6, then you should use
352the six_ project and its ``b()`` function to denote bytes literals. For text
353literals you can either use six's ``u()`` function or use a ``u`` prefix.
354
355
356Decide what APIs Will Accept
357****************************
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000358
Brett Cannon8045d972011-02-03 22:01:54 +0000359In Python 2 it was very easy to accidentally create an API that accepted both
360bytes and textual data. But in Python 3, thanks to the more strict handling of
361disparate types, this loose usage of bytes and text together tends to fail.
362
363Take the dict ``{b'a': 'bytes', u'a': 'text'}`` in Python 2.6. It creates the
364dict ``{u'a': 'text'}`` since ``b'a' == u'a'``. But in Python 3 the equivalent
365dict creates ``{b'a': 'bytes', 'a': 'text'}``, i.e., no lost data. Similar
366issues can crop up when transitioning Python 2 code to Python 3.
367
368This means you need to choose what an API is going to accept and create and
369consistently stick to that API in both Python 2 and 3.
370
371
Brett Cannonce71ab22011-02-05 22:05:05 +0000372Bytes / Unicode Comparison
Antoine Pitrou8d8f7c52011-02-05 11:40:05 +0000373**************************
374
375In Python 3, mixing bytes and unicode is forbidden in most situations; it
376will raise a :class:`TypeError` where Python 2 would have attempted an implicit
377coercion between types. However, there is one case where it doesn't and
378it can be very misleading::
379
380 >>> b"" == ""
381 False
382
Brett Cannona2f15442011-02-09 22:55:13 +0000383This is because an equality comparison is required by the language to always
Antoine Pitrou8d8f7c52011-02-05 11:40:05 +0000384succeed (and return ``False`` for incompatible types). However, this also
385means that code incorrectly ported to Python 3 can display buggy behaviour
386if such comparisons are silently executed. To detect such situations,
387Python 3 has a ``-b`` flag that will display a warning::
388
389 $ python3 -b
390 >>> b"" == ""
391 __main__:1: BytesWarning: Comparison between bytes and string
392 False
393
394To turn the warning into an exception, use the ``-bb`` flag instead::
395
396 $ python3 -bb
397 >>> b"" == ""
398 Traceback (most recent call last):
399 File "<stdin>", line 1, in <module>
400 BytesWarning: Comparison between bytes and string
401
402
Antoine Pitroubd866e92011-02-05 12:13:38 +0000403Indexing bytes objects
404''''''''''''''''''''''
405
406Another potentially surprising change is the indexing behaviour of bytes
407objects in Python 3::
408
409 >>> b"xyz"[0]
410 120
411
412Indeed, Python 3 bytes objects (as well as :class:`bytearray` objects)
413are sequences of integers. But code converted from Python 2 will often
414assume that indexing a bytestring produces another bytestring, not an
415integer. To reconcile both behaviours, use slicing::
416
417 >>> b"xyz"[0:1]
418 b'x'
419 >>> n = 1
420 >>> b"xyz"[n:n+1]
421 b'y'
422
423The only remaining gotcha is that an out-of-bounds slice returns an empty
424bytes object instead of raising ``IndexError``:
425
426 >>> b"xyz"[3]
427 Traceback (most recent call last):
428 File "<stdin>", line 1, in <module>
429 IndexError: index out of range
430 >>> b"xyz"[3:4]
431 b''
432
433
Brett Cannon8045d972011-02-03 22:01:54 +0000434``__str__()``/``__unicode__()``
435'''''''''''''''''''''''''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000436
Brett Cannon8045d972011-02-03 22:01:54 +0000437In Python 2, objects can specify both a string and unicode representation of
438themselves. In Python 3, though, there is only a string representation. This
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000439becomes an issue as people can inadvertently do things in their ``__str__()``
Brett Cannon8045d972011-02-03 22:01:54 +0000440methods which have unpredictable results (e.g., infinite recursion if you
441happen to use the ``unicode(self).encode('utf8')`` idiom as the body of your
442``__str__()`` method).
443
444There are two ways to solve this issue. One is to use a custom 2to3 fixer. The
445blog post at http://lucumr.pocoo.org/2011/1/22/forwards-compatible-python/
446specifies how to do this. That will allow 2to3 to change all instances of ``def
447__unicode(self): ...`` to ``def __str__(self): ...``. This does require you
448define your ``__str__()`` method in Python 2 before your ``__unicode__()``
449method.
450
451The other option is to use a mixin class. This allows you to only define a
452``__unicode__()`` method for your class and let the mixin derive
453``__str__()`` for you (code from
454http://lucumr.pocoo.org/2011/1/22/forwards-compatible-python/)::
455
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000456 import sys
Brett Cannon8045d972011-02-03 22:01:54 +0000457
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000458 class UnicodeMixin(object):
Brett Cannon8045d972011-02-03 22:01:54 +0000459
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000460 """Mixin class to handle defining the proper __str__/__unicode__
461 methods in Python 2 or 3."""
Brett Cannon8045d972011-02-03 22:01:54 +0000462
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000463 if sys.version_info[0] >= 3: # Python 3
464 def __str__(self):
465 return self.__unicode__()
466 else: # Python 2
467 def __str__(self):
468 return self.__unicode__().encode('utf8')
Brett Cannon8045d972011-02-03 22:01:54 +0000469
470
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000471 class Spam(UnicodeMixin):
Brett Cannon8045d972011-02-03 22:01:54 +0000472
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000473 def __unicode__(self):
474 return u'spam-spam-bacon-spam' # 2to3 will remove the 'u' prefix
Brett Cannon8045d972011-02-03 22:01:54 +0000475
476
Brett Cannon8045d972011-02-03 22:01:54 +0000477Don't Index on Exceptions
478'''''''''''''''''''''''''
Antoine Pitrou5c28cfdc2011-02-05 11:53:39 +0000479
Brett Cannon8045d972011-02-03 22:01:54 +0000480In Python 2, the following worked::
481
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000482 >>> exc = Exception(1, 2, 3)
483 >>> exc.args[1]
484 2
485 >>> exc[1] # Python 2 only!
486 2
Brett Cannon8045d972011-02-03 22:01:54 +0000487
Eli Bendersky7ac34192011-02-07 04:44:19 +0000488But in Python 3, indexing directly on an exception is an error. You need to
489make sure to only index on the :attr:`BaseException.args` attribute which is a
Brett Cannon8045d972011-02-03 22:01:54 +0000490sequence containing all arguments passed to the :meth:`__init__` method.
491
Eli Bendersky7ac34192011-02-07 04:44:19 +0000492Even better is to use the documented attributes the exception provides.
Brett Cannon8045d972011-02-03 22:01:54 +0000493
Brett Cannon8045d972011-02-03 22:01:54 +0000494Don't use ``__getslice__`` & Friends
495''''''''''''''''''''''''''''''''''''
Antoine Pitrou5c28cfdc2011-02-05 11:53:39 +0000496
Brett Cannon8045d972011-02-03 22:01:54 +0000497Been deprecated for a while, but Python 3 finally drops support for
498``__getslice__()``, etc. Move completely over to :meth:`__getitem__` and
499friends.
500
501
Brett Cannon45aa7cc2011-02-05 22:16:40 +0000502Updating doctests
503'''''''''''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000504
Brett Cannon45aa7cc2011-02-05 22:16:40 +00005052to3_ will attempt to generate fixes for doctests that it comes across. It's
506not perfect, though. If you wrote a monolithic set of doctests (e.g., a single
507docstring containing all of your doctests), you should at least consider
508breaking the doctests up into smaller pieces to make it more manageable to fix.
509Otherwise it might very well be worth your time and effort to port your tests
510to :mod:`unittest`.
Brett Cannon8045d972011-02-03 22:01:54 +0000511
512
513Eliminate ``-3`` Warnings
514-------------------------
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000515
Brett Cannon8045d972011-02-03 22:01:54 +0000516When you run your application's test suite, run it using the ``-3`` flag passed
517to Python. This will cause various warnings to be raised during execution about
518things that 2to3 cannot handle automatically (e.g., modules that have been
519removed). Try to eliminate those warnings to make your code even more portable
520to Python 3.
521
522
523Run 2to3
524--------
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000525
Brett Cannon8045d972011-02-03 22:01:54 +0000526Once you have made your Python 2 code future-compatible with Python 3, it's
527time to use 2to3_ to actually port your code.
528
529
530Manually
531''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000532
Brett Cannon8045d972011-02-03 22:01:54 +0000533To manually convert source code using 2to3_, you use the ``2to3`` script that
534is installed with Python 2.6 and later.::
535
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000536 2to3 <directory or file to convert>
Brett Cannon8045d972011-02-03 22:01:54 +0000537
538This will cause 2to3 to write out a diff with all of the fixers applied for the
539converted source code. If you would like 2to3 to go ahead and apply the changes
540you can pass it the ``-w`` flag::
541
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000542 2to3 -w <stuff to convert>
Brett Cannon8045d972011-02-03 22:01:54 +0000543
544There are other flags available to control exactly which fixers are applied,
545etc.
546
547
548During Installation
549'''''''''''''''''''
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000550
Brett Cannon8045d972011-02-03 22:01:54 +0000551When a user installs your project for Python 3, you can have either
552:mod:`distutils` or Distribute_ run 2to3_ on your behalf.
553For distutils, use the following idiom::
554
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000555 try: # Python 3
556 from distutils.command.build_py import build_py_2to3 as build_py
557 except ImportError: # Python 2
558 from distutils.command.build_py import build_py
Brett Cannon8045d972011-02-03 22:01:54 +0000559
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000560 setup(cmdclass = {'build_py':build_py},
561 # ...
562 )
Brett Cannon8045d972011-02-03 22:01:54 +0000563
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000564 For Distribute::
Brett Cannon8045d972011-02-03 22:01:54 +0000565
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000566 setup(use_2to3=True,
567 # ...
568 )
Brett Cannon8045d972011-02-03 22:01:54 +0000569
570This will allow you to not have to distribute a separate Python 3 version of
571your project. It does require, though, that when you perform development that
572you at least build your project and use the built Python 3 source for testing.
573
574
575Verify & Test
576-------------
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000577
Brett Cannon8045d972011-02-03 22:01:54 +0000578At this point you should (hopefully) have your project converted in such a way
579that it works in Python 3. Verify it by running your unit tests and making sure
580nothing has gone awry. If you miss something then figure out how to fix it in
581Python 3, backport to your Python 2 code, and run your code through 2to3 again
582to verify the fix transforms properly.
583
584
585.. _2to3: http://docs.python.org/py3k/library/2to3.html
586.. _Distribute: http://packages.python.org/distribute/
587
588
589.. _use_same_source:
590
591Python 2/3 Compatible Source
592============================
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000593
Brett Cannon8045d972011-02-03 22:01:54 +0000594While it may seem counter-intuitive, you can write Python code which is
595source-compatible between Python 2 & 3. It does lead to code that is not
596entirely idiomatic Python (e.g., having to extract the currently raised
597exception from ``sys.exc_info()[1]``), but it can be run under Python 2
598**and** Python 3 without using 2to3_ as a translation step. This allows you to
599continue to have a rapid development process regardless of whether you are
600developing under Python 2 or Python 3. Whether this approach or using
601:ref:`use_2to3` works best for you will be a per-project decision.
602
603To get a complete idea of what issues you will need to deal with, see the
604`What's New in Python 3.0`_. Others have reorganized the data in other formats
605such as http://docs.pythonsprints.com/python3_porting/py-porting.html .
606
607The following are some steps to take to try to support both Python 2 & 3 from
608the same source code.
609
610
611.. _What's New in Python 3.0: http://docs.python.org/release/3.0/whatsnew/3.0.html
612
613
614Follow The Steps for Using 2to3_ (sans 2to3)
615--------------------------------------------
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000616
Brett Cannon8045d972011-02-03 22:01:54 +0000617All of the steps outlined in how to
618:ref:`port Python 2 code with 2to3 <use_2to3>` apply
619to creating a Python 2/3 codebase. This includes trying only support Python 2.6
620or newer (the :mod:`__future__` statements work in Python 3 without issue),
621eliminating warnings that are triggered by ``-3``, etc.
622
Brett Cannon98135d02011-02-05 22:22:47 +0000623You should even consider running 2to3_ over your code (without committing the
624changes). This will let you know where potential pain points are within your
625code so that you can fix them properly before they become an issue.
Brett Cannon8045d972011-02-03 22:01:54 +0000626
627
628Use six_
629--------
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000630
Brett Cannon8045d972011-02-03 22:01:54 +0000631The six_ project contains many things to help you write portable Python code.
632You should make sure to read its documentation from beginning to end and use
633any and all features it provides. That way you will minimize any mistakes you
634might make in writing cross-version code.
635
636
637Capturing the Currently Raised Exception
638----------------------------------------
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000639
Brett Cannonce71ab22011-02-05 22:05:05 +0000640One change between Python 2 and 3 that will require changing how you code (if
641you support `Python 2.5`_ and earlier) is
642accessing the currently raised exception. In Python 2.5 and earlier the syntax
643to access the current exception is::
Brett Cannon8045d972011-02-03 22:01:54 +0000644
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000645 try:
646 raise Exception()
647 except Exception, exc:
648 # Current exception is 'exc'
649 pass
Brett Cannon8045d972011-02-03 22:01:54 +0000650
Brett Cannonce71ab22011-02-05 22:05:05 +0000651This syntax changed in Python 3 (and backported to `Python 2.6`_ and later)
652to::
Brett Cannon8045d972011-02-03 22:01:54 +0000653
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000654 try:
655 raise Exception()
656 except Exception as exc:
657 # Current exception is 'exc'
Brett Cannonce71ab22011-02-05 22:05:05 +0000658 # In Python 3, 'exc' is restricted to the block; Python 2.6 will "leak"
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000659 pass
Brett Cannon8045d972011-02-03 22:01:54 +0000660
661Because of this syntax change you must change to capturing the current
662exception to::
663
Brett Cannon4b0c24a2011-02-03 22:14:58 +0000664 try:
665 raise Exception()
666 except Exception:
667 import sys
668 exc = sys.exc_info()[1]
669 # Current exception is 'exc'
670 pass
Brett Cannon8045d972011-02-03 22:01:54 +0000671
672You can get more information about the raised exception from
673:func:`sys.exc_info` than simply the current exception instance, but you most
Antoine Pitroue6a14642011-02-05 12:01:07 +0000674likely don't need it.
Brett Cannon8045d972011-02-03 22:01:54 +0000675
Antoine Pitroue6a14642011-02-05 12:01:07 +0000676.. note::
677 In Python 3, the traceback is attached to the exception instance
Brett Cannonce71ab22011-02-05 22:05:05 +0000678 through the ``__traceback__`` attribute. If the instance is saved in
Antoine Pitroue6a14642011-02-05 12:01:07 +0000679 a local variable that persists outside of the ``except`` block, the
680 traceback will create a reference cycle with the current frame and its
681 dictionary of local variables. This will delay reclaiming dead
682 resources until the next cyclic :term:`garbage collection` pass.
683
684 In Python 2, this problem only occurs if you save the traceback itself
685 (e.g. the third element of the tuple returned by :func:`sys.exc_info`)
686 in a variable.
Brett Cannon8045d972011-02-03 22:01:54 +0000687
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000688
Brett Cannon8045d972011-02-03 22:01:54 +0000689Other Resources
690===============
Georg Brandl2cb2fa92011-02-07 15:30:45 +0000691
692The authors of the following blog posts and wiki pages deserve special thanks
Brett Cannon8045d972011-02-03 22:01:54 +0000693for making public their tips for porting Python 2 code to Python 3 (and thus
694helping provide information for this document):
695
696* http://docs.pythonsprints.com/python3_porting/py-porting.html
697* http://techspot.zzzeek.org/2011/01/24/zzzeek-s-guide-to-python-3-porting/
698* http://dabeaz.blogspot.com/2011/01/porting-py65-and-my-superboard-to.html
699* http://lucumr.pocoo.org/2011/1/22/forwards-compatible-python/
700* http://lucumr.pocoo.org/2010/2/11/porting-to-python-3-a-guide/
701* http://wiki.python.org/moin/PortingPythonToPy3k
702
703If you feel there is something missing from this document that should be added,
704please email the python-porting_ mailing list.
705
706.. _python-porting: http://mail.python.org/mailman/listinfo/python-porting