diff --git a/oslo_utils/importutils.py b/oslo_utils/importutils.py index 3ddcfde..5156cab 100644 --- a/oslo_utils/importutils.py +++ b/oslo_utils/importutils.py @@ -91,3 +91,21 @@ def try_import(import_str, default=None): return import_module(import_str) except ImportError: return default + + +def import_any(module, *modules): + """Try to import a module from a list of modules. + + :param modules: A list of modules to try and import + :returns: The first module found that can be imported + :raises ImportError: If no modules can be imported from list + + .. versionadded:: 3.8 + """ + for module_name in (module,) + modules: + imported_module = try_import(module_name) + if imported_module: + return imported_module + + raise ImportError('Unable to import any modules from the list %s' % + str(modules)) diff --git a/oslo_utils/tests/test_importutils.py b/oslo_utils/tests/test_importutils.py index 05551ef..dde97fb 100644 --- a/oslo_utils/tests/test_importutils.py +++ b/oslo_utils/tests/test_importutils.py @@ -123,3 +123,11 @@ class ImportUtilsTest(test_base.BaseTestCase): def test_try_import_returns_default(self): foo = importutils.try_import('foo.bar') self.assertIsNone(foo) + + def test_import_any_none_found(self): + self.assertRaises(ImportError, importutils.import_any, + 'foo.bar', 'foo.foo.bar') + + def test_import_any_found(self): + dt = importutils.import_any('foo.bar', 'datetime') + self.assertEqual(sys.modules['datetime'], dt)