| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 1 | .. _pyporting-howto: | 
 | 2 |  | 
 | 3 | ********************************* | 
 | 4 | Porting Python 2 Code to Python 3 | 
 | 5 | ********************************* | 
 | 6 |  | 
 | 7 | :author: Brett Cannon | 
 | 8 |  | 
 | 9 | .. topic:: Abstract | 
 | 10 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 11 |    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 Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 16 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 17 |    If you are looking to port an extension module instead of pure Python code, | 
| Éric Araujo | 5405a0b | 2011-02-05 16:03:12 +0000 | [diff] [blame] | 18 |    please see :ref:`cporting-howto`. | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 19 |  | 
 | 20 |  | 
 | 21 | Choosing a Strategy | 
 | 22 | =================== | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 23 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 24 | When a project makes the decision that it's time to support both Python 2 & 3, | 
 | 25 | a decision needs to be made as to how to go about accomplishing that goal. | 
| Eli Bendersky | 2d062de | 2011-02-07 04:19:57 +0000 | [diff] [blame] | 26 | The chosen strategy will depend on how large the project's existing | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 27 | codebase is and how much divergence you want from your Python 2 codebase from | 
 | 28 | your Python 3 one (e.g., starting a new version with Python 3). | 
 | 29 |  | 
 | 30 | If your project is brand-new or does not have a large codebase, then you may | 
 | 31 | want to consider writing/porting :ref:`all of your code for Python 3 | 
 | 32 | and use 3to2 <use_3to2>` to port your code for Python 2. | 
 | 33 |  | 
 | 34 | If your project has a pre-existing Python 2 codebase and you would like Python | 
 | 35 | 3 support to start off a new branch or version of your project, then you will | 
| Eli Bendersky | 2d062de | 2011-02-07 04:19:57 +0000 | [diff] [blame] | 36 | most likely want to :ref:`port using 2to3 <use_2to3>`. This will allow you to | 
 | 37 | port your Python 2 code to Python 3 in a semi-automated fashion and begin to | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 38 | maintain it separately from your Python 2 code. This approach can also work if | 
 | 39 | your codebase is small and/or simple enough for the translation to occur | 
 | 40 | quickly. | 
 | 41 |  | 
 | 42 | Finally, if you want to maintain Python 2 and Python 3 versions of your project | 
 | 43 | simultaneously and with no differences, then you can write :ref:`Python 2/3 | 
 | 44 | source-compatible code <use_same_source>`. While the code is not quite as | 
 | 45 | idiomatic as it would be written just for Python 3 or automating the port from | 
 | 46 | Python 2, it does makes it easier to continue to do rapid development | 
 | 47 | regardless of what major version of Python you are developing against at the | 
 | 48 | time. | 
 | 49 |  | 
 | 50 | Regardless of which approach you choose, porting is probably not as hard or | 
 | 51 | time-consuming as you might initially think. You can also tackle the problem | 
 | 52 | piece-meal as a good portion of porting is simply updating your code to follow | 
 | 53 | current best practices in a Python 2/3 compatible way. | 
 | 54 |  | 
 | 55 |  | 
 | 56 | Universal Bits of Advice | 
 | 57 | ------------------------ | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 58 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 59 | Regardless of what strategy you pick, there are a few things you should | 
 | 60 | consider. | 
 | 61 |  | 
 | 62 | One is make sure you have a robust test suite. You need to make sure everything | 
 | 63 | continues to work, just like when you support a new minor version of Python. | 
 | 64 | This means making sure your test suite is thorough and is ported properly | 
 | 65 | between Python 2 & 3. You will also most likely want to use something like tox_ | 
 | 66 | to automate testing between both a Python 2 and Python 3 VM. | 
 | 67 |  | 
 | 68 | Two, once your project has Python 3 support, make sure to add the proper | 
 | 69 | classifier on the Cheeseshop_ (PyPI_). To have your project listed as Python 3 | 
 | 70 | compatible it must have the | 
 | 71 | `Python 3 classifier <http://pypi.python.org/pypi?:action=browse&c=533>`_ | 
 | 72 | (from | 
 | 73 | http://techspot.zzzeek.org/2011/01/24/zzzeek-s-guide-to-python-3-porting/):: | 
 | 74 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 75 |    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 Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 89 |  | 
 | 90 |  | 
 | 91 | Doing 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 | 
 | 94 | you set the classifier properly as visiting your project page on the Cheeseshop | 
 | 95 | will show a Python 3 logo in the upper-left corner of the page. | 
 | 96 |  | 
 | 97 | Three, the six_ project provides a library which helps iron out differences | 
 | 98 | between Python 2 & 3. If you find there is a sticky point that is a continual | 
 | 99 | point of contention in your translation or maintenance of code, consider using | 
 | 100 | a source-compatible solution relying on six. If you have to create your own | 
 | 101 | Python 2/3 compatible solution, you can use ``sys.version_info[0] >= 3`` as a | 
 | 102 | guard. | 
 | 103 |  | 
 | 104 | Four, read all the approaches. Just because some bit of advice applies to one | 
 | 105 | approach more than another doesn't mean that some advice doesn't apply to other | 
 | 106 | strategies. | 
 | 107 |  | 
| Eli Bendersky | 2d062de | 2011-02-07 04:19:57 +0000 | [diff] [blame] | 108 | Five, drop support for older Python versions if possible. `Python 2.5`_ | 
 | 109 | introduced a lot of useful syntax and libraries which have become idiomatic | 
 | 110 | in Python 3. `Python 2.6`_ introduced future statements which makes | 
 | 111 | compatibility much easier if you are going from Python 2 to 3. | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 112 | `Python 2.7`_ continues the trend in the stdlib. So choose the newest version | 
| Eli Bendersky | 2d062de | 2011-02-07 04:19:57 +0000 | [diff] [blame] | 113 | of Python which you believe can be your minimum support version | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 114 | and 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 Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 125 | .. _Python 2.3: http://www.python.org/2.3.x | 
 | 126 | .. _Python 2.2: http://www.python.org/2.2.x | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 127 |  | 
 | 128 |  | 
 | 129 | .. _use_3to2: | 
 | 130 |  | 
 | 131 | Python 3 and 3to2 | 
 | 132 | ================= | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 133 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 134 | If you are starting a new project or your codebase is small enough, you may | 
 | 135 | want to consider writing your code for Python 3 and backporting to Python 2 | 
 | 136 | using 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 | 
 | 138 | straightforward than from Python 2 to 3. Plus it gives you more direct | 
 | 139 | experience developing in Python 3 which, since it is the future of Python, is a | 
 | 140 | good thing long-term. | 
 | 141 |  | 
 | 142 | A drawback of this approach is that 3to2 is a third-party project. This means | 
 | 143 | that the Python core developers (and thus this guide) can make no promises | 
 | 144 | about how well 3to2 works at any time. There is nothing to suggest, though, | 
 | 145 | that 3to2 is not a high-quality project. | 
 | 146 |  | 
 | 147 |  | 
 | 148 | .. _3to2: https://bitbucket.org/amentajo/lib3to2/overview | 
 | 149 |  | 
 | 150 |  | 
 | 151 | .. _use_2to3: | 
 | 152 |  | 
 | 153 | Python 2 and 2to3 | 
 | 154 | ================= | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 155 |  | 
| Eli Bendersky | 7ac3419 | 2011-02-07 04:44:19 +0000 | [diff] [blame] | 156 | Included with Python since 2.6, the 2to3_ tool (and :mod:`lib2to3` module) | 
 | 157 | helps with porting Python 2 to Python 3 by performing various source | 
 | 158 | translations. This is a perfect solution for projects which wish to branch | 
 | 159 | their Python 3 code from their Python 2 codebase and maintain them as | 
 | 160 | independent codebases. You can even begin preparing to use this approach | 
 | 161 | today by writing future-compatible Python code which works cleanly in | 
 | 162 | Python 2 in conjunction with 2to3; all steps outlined below will work | 
 | 163 | with Python 2 code up to the point when the actual use of 2to3 occurs. | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 164 |  | 
 | 165 | Use of 2to3 as an on-demand translation step at install time is also possible, | 
 | 166 | preventing the need to maintain a separate Python 3 codebase, but this approach | 
 | 167 | does come with some drawbacks. While users will only have to pay the | 
 | 168 | translation cost once at installation, you as a developer will need to pay the | 
 | 169 | cost regularly during development. If your codebase is sufficiently large | 
 | 170 | enough then the translation step ends up acting like a compilation step, | 
 | 171 | robbing you of the rapid development process you are used to with Python. | 
 | 172 | Obviously the time required to translate a project will vary, so do an | 
 | 173 | experimental translation just to see how long it takes to evaluate whether you | 
 | 174 | prefer this approach compared to using :ref:`use_same_source` or simply keeping | 
 | 175 | a separate Python 3 codebase. | 
 | 176 |  | 
 | 177 | Below are the typical steps taken by a project which uses a 2to3-based approach | 
 | 178 | to supporting Python 2 & 3. | 
 | 179 |  | 
 | 180 |  | 
 | 181 | Support Python 2.7 | 
 | 182 | ------------------ | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 183 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 184 | As a first step, make sure that your project is compatible with `Python 2.7`_. | 
 | 185 | This is just good to do as Python 2.7 is the last release of Python 2 and thus | 
 | 186 | will be used for a rather long time. It also allows for use of the ``-3`` flag | 
 | 187 | to Python to help discover places in your code which 2to3 cannot handle but are | 
 | 188 | known to cause issues. | 
 | 189 |  | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 190 | Try to Support `Python 2.6`_ and Newer Only | 
 | 191 | ------------------------------------------- | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 192 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 193 | While 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 | 
 | 195 | additions, etc. exist only in Python 2.6 and later which greatly assist in | 
 | 196 | porting to Python 3. But if you project must keep support for `Python 2.5`_ (or | 
 | 197 | even `Python 2.4`_) then it is still possible to port to Python 3. | 
 | 198 |  | 
 | 199 | Below are the benefits you gain if you only have to support Python 2.6 and | 
 | 200 | newer. Some of these options are personal choice while others are | 
 | 201 | **strongly** recommended (the ones that are more for personal choice are | 
 | 202 | labeled as such).  If you continue to support older versions of Python then you | 
 | 203 | at least need to watch out for situations that these solutions fix. | 
 | 204 |  | 
 | 205 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 206 | ``from __future__ import print_function`` | 
 | 207 | ''''''''''''''''''''''''''''''''''''''''' | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 208 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 209 | This is a personal choice. 2to3 handles the translation from the print | 
 | 210 | statement to the print function rather well so this is an optional step. This | 
 | 211 | future 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 Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 217 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 218 | Another personal choice. You can always mark what you want to be a (unicode) | 
 | 219 | string with a ``u`` prefix to get the same effect. But regardless of whether | 
 | 220 | you use this future statement or not, you **must** make sure you know exactly | 
 | 221 | which Python 2 strings you want to be bytes, and which are to be strings. This | 
 | 222 | means you should, **at minimum** mark all strings that are meant to be text | 
 | 223 | strings with a ``u`` prefix if you do not use this future statement. | 
 | 224 |  | 
 | 225 |  | 
 | 226 | Bytes literals | 
 | 227 | '''''''''''''' | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 228 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 229 | This is a **very** important one. The ability to prefix Python 2 strings that | 
 | 230 | are meant to contain bytes with a ``b`` prefix help to very clearly delineate | 
 | 231 | what is and is not a Python 3 string. When you run 2to3 on code, all Python 2 | 
 | 232 | strings become Python 3 strings **unless** they are prefixed with ``b``. | 
 | 233 |  | 
 | 234 | There are some differences between byte literals in Python 2 and those in | 
 | 235 | Python 3 thanks to the bytes type just being an alias to ``str`` in Python 2. | 
 | 236 | Probably the biggest "gotcha" is that indexing results in different values. In | 
 | 237 | Python 2, the value of ``b'py'[1]`` is ``'y'``, while in Python 3 it's ``121``. | 
 | 238 | You 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 | 
 | 240 | enough). | 
 | 241 |  | 
 | 242 | You cannot concatenate bytes and strings in Python 3. But since in Python | 
 | 243 | 2 has bytes aliased to ``str``, it will succeed: ``b'a' + u'b'`` works in | 
 | 244 | Python 2, but ``b'a' + 'b'`` in Python 3 is a :exc:`TypeError`. A similar issue | 
 | 245 | also comes about when doing comparisons between bytes and strings. | 
 | 246 |  | 
 | 247 |  | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 248 | Supporting `Python 2.5`_ and Newer Only | 
 | 249 | --------------------------------------- | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 250 |  | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 251 | If you are supporting `Python 2.5`_ and newer there are still some features of | 
 | 252 | Python that you can utilize. | 
 | 253 |  | 
 | 254 |  | 
 | 255 | ``from __future__ import absolute_imports`` | 
 | 256 | ''''''''''''''''''''''''''''''''''''''''''' | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 257 |  | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 258 | Implicit relative imports (e.g., importing ``spam.bacon`` from within | 
 | 259 | ``spam.eggs`` with the statement ``import bacon``) does not work in Python 3. | 
 | 260 | This future statement moves away from that and allows the use of explicit | 
 | 261 | relative imports (e.g., ``from . import bacon``). | 
 | 262 |  | 
 | 263 | In `Python 2.5`_ you must use | 
 | 264 | the __future__ statement to get to use explicit relative imports and prevent | 
 | 265 | implicit ones. In `Python 2.6`_ explicit relative imports are available without | 
 | 266 | the statement, but you still want the __future__ statement to prevent implicit | 
 | 267 | relative imports. In `Python 2.7`_ the __future__ statement is not needed. In | 
 | 268 | other words, unless you are only supporting Python 2.7 or a version earlier | 
 | 269 | than Python 2.5, use the __future__ statement. | 
 | 270 |  | 
 | 271 |  | 
 | 272 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 273 | Handle Common "Gotchas" | 
 | 274 | ----------------------- | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 275 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 276 | There are a few things that just consistently come up as sticking points for | 
 | 277 | people which 2to3 cannot handle automatically or can easily be done in Python 2 | 
 | 278 | to help modernize your code. | 
 | 279 |  | 
 | 280 |  | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 281 | ``from __future__ import division`` | 
 | 282 | ''''''''''''''''''''''''''''''''''' | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 283 |  | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 284 | While the exact same outcome can be had by using the ``-Qnew`` argument to | 
 | 285 | Python, using this future statement lifts the requirement that your users use | 
 | 286 | the 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 Pitrou | 5c28cfdc | 2011-02-05 11:53:39 +0000 | [diff] [blame] | 291 | Specify when opening a file as binary | 
 | 292 | ''''''''''''''''''''''''''''''''''''' | 
 | 293 |  | 
 | 294 | Unless you have been working on Windows, there is a chance you have not always | 
 | 295 | bothered to add the ``b`` mode when opening a binary file (e.g., ``rb`` for | 
 | 296 | binary reading).  Under Python 3, binary files and text files are clearly | 
 | 297 | distinct and mutually incompatible; see the :mod:`io` module for details. | 
 | 298 | Therefore, you **must** make a decision of whether a file will be used for | 
 | 299 | binary access (allowing to read and/or write bytes data) or text access | 
 | 300 | (allowing to read and/or write unicode data). | 
 | 301 |  | 
 | 302 | Text files | 
 | 303 | '''''''''' | 
 | 304 |  | 
 | 305 | Text files created using ``open()`` under Python 2 return byte strings, | 
 | 306 | while under Python 3 they return unicode strings.  Depending on your porting | 
 | 307 | strategy, this can be an issue. | 
 | 308 |  | 
 | 309 | If you want text files to return unicode strings in Python 2, you have two | 
 | 310 | possibilities: | 
 | 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 Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 319 | Subclass ``object`` | 
 | 320 | ''''''''''''''''''' | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 321 |  | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 322 | New-style classes have been around since `Python 2.2`_. You need to make sure | 
 | 323 | you are subclassing from ``object`` to avoid odd edge cases involving method | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 324 | resolution order, etc. This continues to be totally valid in Python 3 (although | 
 | 325 | unneeded as all classes implicitly inherit from ``object``). | 
 | 326 |  | 
 | 327 |  | 
 | 328 | Deal With the Bytes/String Dichotomy | 
 | 329 | '''''''''''''''''''''''''''''''''''' | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 330 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 331 | One of the biggest issues people have when porting code to Python 3 is handling | 
 | 332 | the bytes/string dichotomy. Because Python 2 allowed the ``str`` type to hold | 
 | 333 | textual data, people have over the years been rather loose in their delineation | 
 | 334 | of what ``str`` instances held text compared to bytes. In Python 3 you cannot | 
 | 335 | be so care-free anymore and need to properly handle the difference. The key | 
 | 336 | handling this issue to to make sure that **every** string literal in your | 
 | 337 | Python 2 code is either syntactically of functionally marked as either bytes or | 
 | 338 | text data. After this is done you then need to make sure your APIs are designed | 
 | 339 | to either handle a specific type or made to be properly polymorphic. | 
 | 340 |  | 
 | 341 |  | 
 | 342 | Mark Up Python 2 String Literals | 
 | 343 | ******************************** | 
 | 344 |  | 
 | 345 | First thing you must do is designate every single string literal in Python 2 | 
 | 346 | as either textual or bytes data. If you are only supporting Python 2.6 or | 
 | 347 | newer, this can be accomplished by marking bytes literals with a ``b`` prefix | 
 | 348 | and then designating textual data with a ``u`` prefix or using the | 
 | 349 | ``unicode_literals`` future statement. | 
 | 350 |  | 
 | 351 | If your project supports versions of Python pre-dating 2.6, then you should use | 
 | 352 | the six_ project and its ``b()`` function to denote bytes literals. For text | 
 | 353 | literals you can either use six's ``u()`` function or use a ``u`` prefix. | 
 | 354 |  | 
 | 355 |  | 
 | 356 | Decide what APIs Will Accept | 
 | 357 | **************************** | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 358 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 359 | In Python 2 it was very easy to accidentally create an API that accepted both | 
 | 360 | bytes and textual data. But in Python 3, thanks to the more strict handling of | 
 | 361 | disparate types, this loose usage of bytes and text together tends to fail. | 
 | 362 |  | 
 | 363 | Take the dict ``{b'a': 'bytes', u'a': 'text'}`` in Python 2.6. It creates the | 
 | 364 | dict ``{u'a': 'text'}`` since ``b'a' == u'a'``. But in Python 3 the equivalent | 
 | 365 | dict creates ``{b'a': 'bytes', 'a': 'text'}``, i.e., no lost data. Similar | 
 | 366 | issues can crop up when transitioning Python 2 code to Python 3. | 
 | 367 |  | 
 | 368 | This means you need to choose what an API is going to accept and create and | 
 | 369 | consistently stick to that API in both Python 2 and 3. | 
 | 370 |  | 
 | 371 |  | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 372 | Bytes / Unicode Comparison | 
| Antoine Pitrou | 8d8f7c5 | 2011-02-05 11:40:05 +0000 | [diff] [blame] | 373 | ************************** | 
 | 374 |  | 
 | 375 | In Python 3, mixing bytes and unicode is forbidden in most situations; it | 
 | 376 | will raise a :class:`TypeError` where Python 2 would have attempted an implicit | 
 | 377 | coercion between types.  However, there is one case where it doesn't and | 
 | 378 | it can be very misleading:: | 
 | 379 |  | 
 | 380 |    >>> b"" == "" | 
 | 381 |    False | 
 | 382 |  | 
| Brett Cannon | a2f1544 | 2011-02-09 22:55:13 +0000 | [diff] [blame] | 383 | This is because an equality comparison is required by the language to always | 
| Antoine Pitrou | 8d8f7c5 | 2011-02-05 11:40:05 +0000 | [diff] [blame] | 384 | succeed (and return ``False`` for incompatible types).  However, this also | 
 | 385 | means that code incorrectly ported to Python 3 can display buggy behaviour | 
 | 386 | if such comparisons are silently executed.  To detect such situations, | 
 | 387 | Python 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 |  | 
 | 394 | To 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 Pitrou | bd866e9 | 2011-02-05 12:13:38 +0000 | [diff] [blame] | 403 | Indexing bytes objects | 
 | 404 | '''''''''''''''''''''' | 
 | 405 |  | 
 | 406 | Another potentially surprising change is the indexing behaviour of bytes | 
 | 407 | objects in Python 3:: | 
 | 408 |  | 
 | 409 |    >>> b"xyz"[0] | 
 | 410 |    120 | 
 | 411 |  | 
 | 412 | Indeed, Python 3 bytes objects (as well as :class:`bytearray` objects) | 
 | 413 | are sequences of integers.  But code converted from Python 2 will often | 
 | 414 | assume that indexing a bytestring produces another bytestring, not an | 
 | 415 | integer.  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 |  | 
 | 423 | The only remaining gotcha is that an out-of-bounds slice returns an empty | 
 | 424 | bytes 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 Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 434 | ``__str__()``/``__unicode__()`` | 
 | 435 | ''''''''''''''''''''''''''''''' | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 436 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 437 | In Python 2, objects can specify both a string and unicode representation of | 
 | 438 | themselves. In Python 3, though, there is only a string representation. This | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 439 | becomes an issue as people can inadvertently do things in their ``__str__()`` | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 440 | methods which have unpredictable results (e.g., infinite recursion if you | 
 | 441 | happen to use the ``unicode(self).encode('utf8')`` idiom as the body of your | 
 | 442 | ``__str__()`` method). | 
 | 443 |  | 
 | 444 | There are two ways to solve this issue. One is to use a custom 2to3 fixer. The | 
 | 445 | blog post at http://lucumr.pocoo.org/2011/1/22/forwards-compatible-python/ | 
 | 446 | specifies 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 | 
 | 448 | define your ``__str__()`` method in Python 2 before your ``__unicode__()`` | 
 | 449 | method. | 
 | 450 |  | 
 | 451 | The 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 | 
 | 454 | http://lucumr.pocoo.org/2011/1/22/forwards-compatible-python/):: | 
 | 455 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 456 |    import sys | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 457 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 458 |    class UnicodeMixin(object): | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 459 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 460 |      """Mixin class to handle defining the proper __str__/__unicode__ | 
 | 461 |      methods in Python 2 or 3.""" | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 462 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 463 |      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 Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 469 |  | 
 | 470 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 471 |    class Spam(UnicodeMixin): | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 472 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 473 |      def __unicode__(self): | 
 | 474 |          return u'spam-spam-bacon-spam'  # 2to3 will remove the 'u' prefix | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 475 |  | 
 | 476 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 477 | Don't Index on Exceptions | 
 | 478 | ''''''''''''''''''''''''' | 
| Antoine Pitrou | 5c28cfdc | 2011-02-05 11:53:39 +0000 | [diff] [blame] | 479 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 480 | In Python 2, the following worked:: | 
 | 481 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 482 |    >>> exc = Exception(1, 2, 3) | 
 | 483 |    >>> exc.args[1] | 
 | 484 |    2 | 
 | 485 |    >>> exc[1]  # Python 2 only! | 
 | 486 |    2 | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 487 |  | 
| Eli Bendersky | 7ac3419 | 2011-02-07 04:44:19 +0000 | [diff] [blame] | 488 | But in Python 3, indexing directly on an exception is an error. You need to | 
 | 489 | make sure to only index on the :attr:`BaseException.args` attribute which is a | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 490 | sequence containing all arguments passed to the :meth:`__init__` method. | 
 | 491 |  | 
| Eli Bendersky | 7ac3419 | 2011-02-07 04:44:19 +0000 | [diff] [blame] | 492 | Even better is to use the documented attributes the exception provides. | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 493 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 494 | Don't use ``__getslice__`` & Friends | 
 | 495 | '''''''''''''''''''''''''''''''''''' | 
| Antoine Pitrou | 5c28cfdc | 2011-02-05 11:53:39 +0000 | [diff] [blame] | 496 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 497 | Been deprecated for a while, but Python 3 finally drops support for | 
 | 498 | ``__getslice__()``, etc. Move completely over to :meth:`__getitem__` and | 
 | 499 | friends. | 
 | 500 |  | 
 | 501 |  | 
| Brett Cannon | 45aa7cc | 2011-02-05 22:16:40 +0000 | [diff] [blame] | 502 | Updating doctests | 
 | 503 | ''''''''''''''''' | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 504 |  | 
| Brett Cannon | 45aa7cc | 2011-02-05 22:16:40 +0000 | [diff] [blame] | 505 | 2to3_ will attempt to generate fixes for doctests that it comes across. It's | 
 | 506 | not perfect, though. If you wrote a monolithic set of doctests (e.g., a single | 
 | 507 | docstring containing all of your doctests), you should at least consider | 
 | 508 | breaking the doctests up into smaller pieces to make it more manageable to fix. | 
 | 509 | Otherwise it might very well be worth your time and effort to port your tests | 
 | 510 | to :mod:`unittest`. | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 511 |  | 
 | 512 |  | 
 | 513 | Eliminate ``-3`` Warnings | 
 | 514 | ------------------------- | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 515 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 516 | When you run your application's test suite, run it using the ``-3`` flag passed | 
 | 517 | to Python. This will cause various warnings to be raised during execution about | 
 | 518 | things that 2to3 cannot handle automatically (e.g., modules that have been | 
 | 519 | removed). Try to eliminate those warnings to make your code even more portable | 
 | 520 | to Python 3. | 
 | 521 |  | 
 | 522 |  | 
 | 523 | Run 2to3 | 
 | 524 | -------- | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 525 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 526 | Once you have made your Python 2 code future-compatible with Python 3, it's | 
 | 527 | time to use 2to3_ to actually port your code. | 
 | 528 |  | 
 | 529 |  | 
 | 530 | Manually | 
 | 531 | '''''''' | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 532 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 533 | To manually convert source code using 2to3_, you use the ``2to3`` script that | 
 | 534 | is installed with Python 2.6 and later.:: | 
 | 535 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 536 |    2to3 <directory or file to convert> | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 537 |  | 
 | 538 | This will cause 2to3 to write out a diff with all of the fixers applied for the | 
 | 539 | converted source code. If you would like 2to3 to go ahead and apply the changes | 
 | 540 | you can pass it the ``-w`` flag:: | 
 | 541 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 542 |    2to3 -w <stuff to convert> | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 543 |  | 
 | 544 | There are other flags available to control exactly which fixers are applied, | 
 | 545 | etc. | 
 | 546 |  | 
 | 547 |  | 
 | 548 | During Installation | 
 | 549 | ''''''''''''''''''' | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 550 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 551 | When a user installs your project for Python 3, you can have either | 
 | 552 | :mod:`distutils` or Distribute_ run 2to3_ on your behalf. | 
 | 553 | For distutils, use the following idiom:: | 
 | 554 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 555 |    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 Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 559 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 560 |    setup(cmdclass = {'build_py':build_py}, | 
 | 561 |      # ... | 
 | 562 |    ) | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 563 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 564 |    For Distribute:: | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 565 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 566 |    setup(use_2to3=True, | 
 | 567 |      # ... | 
 | 568 |    ) | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 569 |  | 
 | 570 | This will allow you to not have to distribute a separate Python 3 version of | 
 | 571 | your project. It does require, though, that when you perform development that | 
 | 572 | you at least build your project and use the built Python 3 source for testing. | 
 | 573 |  | 
 | 574 |  | 
 | 575 | Verify & Test | 
 | 576 | ------------- | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 577 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 578 | At this point you should (hopefully) have your project converted in such a way | 
 | 579 | that it works in Python 3. Verify it by running your unit tests and making sure | 
 | 580 | nothing has gone awry. If you miss something then figure out how to fix it in | 
 | 581 | Python 3, backport to your Python 2 code, and run your code through 2to3 again | 
 | 582 | to 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 |  | 
 | 591 | Python 2/3 Compatible Source | 
 | 592 | ============================ | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 593 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 594 | While it may seem counter-intuitive, you can write Python code which is | 
 | 595 | source-compatible between Python 2 & 3. It does lead to code that is not | 
 | 596 | entirely idiomatic Python (e.g., having to extract the currently raised | 
 | 597 | exception 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 | 
 | 599 | continue to have a rapid development process regardless of whether you are | 
 | 600 | developing 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 |  | 
 | 603 | To 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 | 
 | 605 | such as http://docs.pythonsprints.com/python3_porting/py-porting.html . | 
 | 606 |  | 
 | 607 | The following are some steps to take to try to support both Python 2 & 3 from | 
 | 608 | the 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 |  | 
 | 614 | Follow The Steps for Using 2to3_ (sans 2to3) | 
 | 615 | -------------------------------------------- | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 616 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 617 | All of the steps outlined in how to | 
 | 618 | :ref:`port Python 2 code with 2to3 <use_2to3>` apply | 
 | 619 | to creating a Python 2/3 codebase. This includes trying only support Python 2.6 | 
 | 620 | or newer (the :mod:`__future__` statements work in Python 3 without issue), | 
 | 621 | eliminating warnings that are triggered by ``-3``, etc. | 
 | 622 |  | 
| Brett Cannon | 98135d0 | 2011-02-05 22:22:47 +0000 | [diff] [blame] | 623 | You should even consider running 2to3_ over your code (without committing the | 
 | 624 | changes). This will let you know where potential pain points are within your | 
 | 625 | code so that you can fix them properly before they become an issue. | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 626 |  | 
 | 627 |  | 
 | 628 | Use six_ | 
 | 629 | -------- | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 630 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 631 | The six_ project contains many things to help you write portable Python code. | 
 | 632 | You should make sure to read its documentation from beginning to end and use | 
 | 633 | any and all features it provides. That way you will minimize any mistakes you | 
 | 634 | might make in writing cross-version code. | 
 | 635 |  | 
 | 636 |  | 
 | 637 | Capturing the Currently Raised Exception | 
 | 638 | ---------------------------------------- | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 639 |  | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 640 | One change between Python 2 and 3 that will require changing how you code (if | 
 | 641 | you support `Python 2.5`_ and earlier) is | 
 | 642 | accessing the currently raised exception.  In Python 2.5 and earlier the syntax | 
 | 643 | to access the current exception is:: | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 644 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 645 |    try: | 
 | 646 |      raise Exception() | 
 | 647 |    except Exception, exc: | 
 | 648 |      # Current exception is 'exc' | 
 | 649 |      pass | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 650 |  | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 651 | This syntax changed in Python 3 (and backported to `Python 2.6`_ and later) | 
 | 652 | to:: | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 653 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 654 |    try: | 
 | 655 |      raise Exception() | 
 | 656 |    except Exception as exc: | 
 | 657 |      # Current exception is 'exc' | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 658 |      # In Python 3, 'exc' is restricted to the block; Python 2.6 will "leak" | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 659 |      pass | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 660 |  | 
 | 661 | Because of this syntax change you must change to capturing the current | 
 | 662 | exception to:: | 
 | 663 |  | 
| Brett Cannon | 4b0c24a | 2011-02-03 22:14:58 +0000 | [diff] [blame] | 664 |    try: | 
 | 665 |      raise Exception() | 
 | 666 |    except Exception: | 
 | 667 |      import sys | 
 | 668 |      exc = sys.exc_info()[1] | 
 | 669 |      # Current exception is 'exc' | 
 | 670 |      pass | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 671 |  | 
 | 672 | You can get more information about the raised exception from | 
 | 673 | :func:`sys.exc_info` than simply the current exception instance, but you most | 
| Antoine Pitrou | e6a1464 | 2011-02-05 12:01:07 +0000 | [diff] [blame] | 674 | likely don't need it. | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 675 |  | 
| Antoine Pitrou | e6a1464 | 2011-02-05 12:01:07 +0000 | [diff] [blame] | 676 | .. note:: | 
 | 677 |    In Python 3, the traceback is attached to the exception instance | 
| Brett Cannon | ce71ab2 | 2011-02-05 22:05:05 +0000 | [diff] [blame] | 678 |    through the ``__traceback__`` attribute. If the instance is saved in | 
| Antoine Pitrou | e6a1464 | 2011-02-05 12:01:07 +0000 | [diff] [blame] | 679 |    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 Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 687 |  | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 688 |  | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 689 | Other Resources | 
 | 690 | =============== | 
| Georg Brandl | 2cb2fa9 | 2011-02-07 15:30:45 +0000 | [diff] [blame] | 691 |  | 
 | 692 | The authors of the following blog posts and wiki pages deserve special thanks | 
| Brett Cannon | 8045d97 | 2011-02-03 22:01:54 +0000 | [diff] [blame] | 693 | for making public their tips for porting Python 2 code to Python 3 (and thus | 
 | 694 | helping 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 |  | 
 | 703 | If you feel there is something missing from this document that should be added, | 
 | 704 | please email the python-porting_ mailing list. | 
 | 705 |  | 
 | 706 | .. _python-porting: http://mail.python.org/mailman/listinfo/python-porting |