Skip to content

Commit

Permalink
Merge for issue python#26095
Browse files Browse the repository at this point in the history
  • Loading branch information
brettcannon committed Mar 18, 2016
2 parents 5936313 + adcb654 commit 81ae89b
Showing 1 changed file with 46 additions and 0 deletions.
46 changes: 46 additions & 0 deletions Doc/howto/pyporting.rst
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,50 @@ To summarize:
appropriate
#. Be careful when indexing binary data


Use feature detection instead of version detection
++++++++++++++++++++++++++++++++++++++++++++++++++
Inevitably you will have code that has to choose what to do based on what
version of Python is running. The best way to do this is with feature detection
of whether the version of Python you're running under supports what you need.
If for some reason that doesn't work then you should make the version check is
against Python 2 and not Python 3. To help explain this, let's look at an
example.

Let's pretend that you need access to a feature of importlib_ that
is available in Python's standard library since Python 3.3 and available for
Python 2 through importlib2_ on PyPI. You might be tempted to write code to
access e.g. the ``importlib.abc`` module by doing the following::

import sys

if sys.version[0] == 3:
from importlib import abc
else:
from importlib2 import abc

The problem with this code is what happens when Python 4 comes out? It would
be better to treat Python 2 as the exceptional case instead of Python 3 and
assume that future Python versions will be more compatible with Python 3 than
Python 2::

import sys

if sys.version[0] > 2:
from importlib import abc
else:
from importlib2 import abc

The best solution, though, is to do no version detection at all and instead rely
on feature detection. That avoids any potential issues of getting the version
detection wrong and helps keep you future-compatible::

try:
from importlib import abc
except ImportError:
from importlib2 import abc


Prevent compatibility regressions
---------------------------------

Expand Down Expand Up @@ -381,6 +425,8 @@ supported by Python 2. You should also update the classifiers in your
.. _cheat sheet: http://python-future.org/compatible_idioms.html
.. _coverage.py: https://pypi.python.org/pypi/coverage
.. _Futurize: http://python-future.org/automatic_conversion.html
.. _importlib: https://docs.python.org/3/library/importlib.html#module-importlib
.. _importlib2: https://pypi.python.org/pypi/importlib2
.. _Modernize: http://python-modernize.readthedocs.org/en/latest/
.. _Porting to Python 3: http://python3porting.com/
.. _Pylint: https://pypi.python.org/pypi/pylint
Expand Down

0 comments on commit 81ae89b

Please sign in to comment.