Search code examples
pythonmigrationmodulecode-migration

Best way to import version-specific python modules


Which method makes the most sense for importing a module in python that is version specific? My use case is that I'm writing code that will be deployed into a python 2.3 environment and in a few months be upgraded to python 2.5. This:

if sys.version_info[:2] >= (2, 5):
    from string import Template
else:
    from our.compat.string import Template

or this

try:
    from string import Template
except ImportError:
    from our.compat.string import Template

I know that either case is equally correct and works correctly but which one is preferable?


Solution

  • Always the second way - you never know what different Python installations will have installed. Template is a specific case where it matters less, but when you test for the capability instead of the versioning you're always more robust.

    That's how I make Testoob support Python 2.2 - 2.6: I try to import a module in different ways until it works. It's also relevant to 3rd-party libraries.

    Here's an extreme case - supporting different options for ElementTree to appear:

    try: import elementtree.ElementTree as ET
    except ImportError:
        try: import cElementTree as ET
        except ImportError:
            try: import lxml.etree as ET
            except ImportError:
                import xml.etree.ElementTree as ET # Python 2.5 and up