文章目录
OpenStack 公共组件 oslo.utils.importutils
import_class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
""" Import related utilities and helper functions. """ import sys import traceback def import_class(import_str): """Returns a class from a string including module and class. # 导入一个类,输入一个"包.类"的字符串,返回其指定的类 """ mod_str, _sep, class_str = import_str.rpartition('.') __import__(mod_str) try: return getattr(sys.modules[mod_str], class_str) except AttributeError: raise ImportError('Class %s cannot be found (%s)' % (class_str, traceback.format_exception(*sys.exc_info()))) |
import_object
1 2 3 4 5 6 7 |
def import_object(import_str, *args, **kwargs): """Import a class and return an instance of it. # 导入一个对象,第一个输入参数为"包.类"的字符串,之后的参数用于创建对应类的对象,该方法即通过import_class(import_str)方法返回一个指定的类, 然后根据args、kwargs等参数创建一个类的对象返回。 .. versionadded:: 0.3 """ return import_class(import_str)(*args, **kwargs) |
import_object_ns
1 2 3 4 5 6 7 8 9 10 11 12 |
def import_object_ns(name_space, import_str, *args, **kwargs): """ 尝试从一个默认的namespace中导入一个对象,首先通过"name_space.import_str"导入类, 如果没找到相应的类则通过"import_str"导入类,然后创建指定的类对象返回。 """ import_value = "%s.%s" % (name_space, import_str) try: cls = import_class(import_value) except ImportError: cls = import_class(import_str) return cls(*args, **kwargs) |
import_module
1 2 3 4 5 6 7 8 9 10 |
def import_module(import_str): """Import a module. 导入一个模块,输入一个表示模块路径的字符串,返回对应的模块 .. versionadded:: 0.3 """ __import__(import_str) # 函数用于动态加载类和函数 首先导入模块 # 然后从 modules 获取模块 return sys.modules[import_str] # sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules都将记录这些模块。 |
import_versioned_module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
def import_versioned_module(module, version, submodule=None): """Import a versioned module in format {module}.v{version][.{submodule}]. :param module: the module name. :param version: the version number. :param submodule: the submodule name. :raises ValueError: For any invalid input. .. versionadded:: 0.3 .. versionchanged:: 3.17 Added *module* parameter. 导入指定版本的模块,导入的格式为"{module}.v{version}.submodule"。 """ # NOTE(gcb) Disallow parameter version include character '.' if '.' in '%s' % version: raise ValueError("Parameter version shouldn't include character '.'.") module_str = '%s.v%s' % (module, version) if submodule: module_str = '.'.join((module_str, submodule)) return import_module(module_str) |
import_versioned_module
1 2 3 4 5 6 |
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 |
import_any
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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)) |
