docs: def try_import(module_name, names=None, default=ImportErrorModule, warn=True):
      """Try import module_name, except ImportError and return default,
          sometimes to be used for catch ImportError and lazy-import.
      """
      try:
          module = importlib.import_module(module_name)
      except ImportError:
          if warn:
              if warn is True:
                  Config.utils_logger.warning(
                      "Module `%s` not found. Install it to remove this warning"
                      % module_name
                  )
              else:
                  warn(module_name, names, default)
          module = (
              ImportErrorModule(module_name) if default is ImportErrorModule else default
          )
      if not names:
          return module
      if not isinstance(names, (tuple, set, list)):
          names = [names]
      result = []
      for name in names:
          if hasattr(module, name):
              result.append(module.__getattribute__(name))
          else:
              result.append(
                  ImportErrorModule("%s.%s" % (module_name, name))
                  if default is ImportErrorModule
                  else default
              )
      return result[0] if len(result) == 1 else result