optional_import

Import something if it exists.


License
MIT
Install
pip install optional_import==1.2

Documentation

Build status

optional_import

Optional imports in Python

Usage

This library contains only the context manager optional_import:

>>> from optional_import import optional_import

A successful import works as usual:

>>> with optional_import():
...     import collections
>>> type(collections)
<type 'module'>

If the import does not exist, optional_import suppresses the ImportError that would otherwise be raised.

>>> import unicorns
Traceback (most recent call last):
  ...
ImportError: No module named unicorns

>>> with optional_import():
...     import unicorns

>>> unicorns
Traceback (most recent call last):
  ...
NameError: name 'unicorns' is not defined

Example: Django local settings

A common pattern in Django is to put default settings in settings.py, put optional site-specific settings in settings_local.py, and import * from the local settings file if it exists.

with optional_import():
    from .settings_local import *

Why not just catch ImportError?

Optional imports can almost be achieved simply by catching ImportError:

try:
    import foo
except ImportError:
    pass

But this approach introduces a problem: If foo exists but raises ImportError, we want that error to be raised, but instead it is swallowed by the except clause.

With optional_import, the error is raised as desired. In the following example, the bad module tries to import a nonexistent package unicorns:

>>> with optional_import():
...     import bad
Traceback (most recent call last):
  ...
ImportError: No module named unicorns