Implement importutils.try_import.

Adds a new (simple) importutils.try_import function which
can return a module name or a default (by default this is None).

This should help clean up some of our

try:
    import foo
except...

blocks in modules.

This commit also drops the dependency on python-extras which is
no longer needed.

Fixes LP Bug #1099501.

Change-Id: I8591f79983bdad67a50d1aaae6dce8428dfce084
This commit is contained in:
Dan Prince 2013-01-14 12:54:43 -05:00
parent d74668fbed
commit 33b12d3c18
4 changed files with 18 additions and 3 deletions

View File

@ -57,3 +57,11 @@ def import_module(import_str):
"""Import a module."""
__import__(import_str)
return sys.modules[import_str]
def try_import(import_str, default=None):
"""Try to import a module and if it fails return default."""
try:
return import_module(import_str)
except ImportError:
return default

View File

@ -27,17 +27,17 @@ import sys
import time
import eventlet
import extras
import logging as std_logging
from openstack.common import cfg
from openstack.common import eventlet_backdoor
from openstack.common.gettextutils import _
from openstack.common import importutils
from openstack.common import log as logging
from openstack.common import threadgroup
rpc = extras.try_import('openstack.common.rpc')
rpc = importutils.try_import('openstack.common.rpc')
CONF = cfg.CONF
LOG = logging.getLogger(__name__)

View File

@ -109,3 +109,11 @@ class ImportUtilsTest(unittest.TestCase):
dt = importutils.import_object('datetime.datetime', 2012, 4, 5)
self.assertTrue(isinstance(dt, sys.modules['datetime'].datetime))
self.assertEqual(dt, datetime.datetime(2012, 4, 5))
def test_try_import(self):
dt = importutils.try_import('datetime')
self.assertEqual(sys.modules['datetime'], dt)
def test_try_import_returns_default(self):
foo = importutils.try_import('foo.bar')
self.assertEqual(None, foo)

View File

@ -1,7 +1,6 @@
PasteDeploy==1.5.0
WebOb==1.2.3
eventlet
extras
greenlet>=0.3.1
lxml
routes==1.12.3