17db96d56Sopenharmony_ci"""A pure Python implementation of import."""
27db96d56Sopenharmony_ci__all__ = ['__import__', 'import_module', 'invalidate_caches', 'reload']
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci# Bootstrap help #####################################################
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci# Until bootstrapping is complete, DO NOT import any modules that attempt
77db96d56Sopenharmony_ci# to import importlib._bootstrap (directly or indirectly). Since this
87db96d56Sopenharmony_ci# partially initialised package would be present in sys.modules, those
97db96d56Sopenharmony_ci# modules would get an uninitialised copy of the source version, instead
107db96d56Sopenharmony_ci# of a fully initialised version (either the frozen one or the one
117db96d56Sopenharmony_ci# initialised below if the frozen one is not available).
127db96d56Sopenharmony_ciimport _imp  # Just the builtin component, NOT the full Python module
137db96d56Sopenharmony_ciimport sys
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_citry:
167db96d56Sopenharmony_ci    import _frozen_importlib as _bootstrap
177db96d56Sopenharmony_ciexcept ImportError:
187db96d56Sopenharmony_ci    from . import _bootstrap
197db96d56Sopenharmony_ci    _bootstrap._setup(sys, _imp)
207db96d56Sopenharmony_cielse:
217db96d56Sopenharmony_ci    # importlib._bootstrap is the built-in import, ensure we don't create
227db96d56Sopenharmony_ci    # a second copy of the module.
237db96d56Sopenharmony_ci    _bootstrap.__name__ = 'importlib._bootstrap'
247db96d56Sopenharmony_ci    _bootstrap.__package__ = 'importlib'
257db96d56Sopenharmony_ci    try:
267db96d56Sopenharmony_ci        _bootstrap.__file__ = __file__.replace('__init__.py', '_bootstrap.py')
277db96d56Sopenharmony_ci    except NameError:
287db96d56Sopenharmony_ci        # __file__ is not guaranteed to be defined, e.g. if this code gets
297db96d56Sopenharmony_ci        # frozen by a tool like cx_Freeze.
307db96d56Sopenharmony_ci        pass
317db96d56Sopenharmony_ci    sys.modules['importlib._bootstrap'] = _bootstrap
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_citry:
347db96d56Sopenharmony_ci    import _frozen_importlib_external as _bootstrap_external
357db96d56Sopenharmony_ciexcept ImportError:
367db96d56Sopenharmony_ci    from . import _bootstrap_external
377db96d56Sopenharmony_ci    _bootstrap_external._set_bootstrap_module(_bootstrap)
387db96d56Sopenharmony_ci    _bootstrap._bootstrap_external = _bootstrap_external
397db96d56Sopenharmony_cielse:
407db96d56Sopenharmony_ci    _bootstrap_external.__name__ = 'importlib._bootstrap_external'
417db96d56Sopenharmony_ci    _bootstrap_external.__package__ = 'importlib'
427db96d56Sopenharmony_ci    try:
437db96d56Sopenharmony_ci        _bootstrap_external.__file__ = __file__.replace('__init__.py', '_bootstrap_external.py')
447db96d56Sopenharmony_ci    except NameError:
457db96d56Sopenharmony_ci        # __file__ is not guaranteed to be defined, e.g. if this code gets
467db96d56Sopenharmony_ci        # frozen by a tool like cx_Freeze.
477db96d56Sopenharmony_ci        pass
487db96d56Sopenharmony_ci    sys.modules['importlib._bootstrap_external'] = _bootstrap_external
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci# To simplify imports in test code
517db96d56Sopenharmony_ci_pack_uint32 = _bootstrap_external._pack_uint32
527db96d56Sopenharmony_ci_unpack_uint32 = _bootstrap_external._unpack_uint32
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci# Fully bootstrapped at this point, import whatever you like, circular
557db96d56Sopenharmony_ci# dependencies and startup overhead minimisation permitting :)
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ciimport warnings
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci# Public API #########################################################
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_cifrom ._bootstrap import __import__
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_cidef invalidate_caches():
667db96d56Sopenharmony_ci    """Call the invalidate_caches() method on all meta path finders stored in
677db96d56Sopenharmony_ci    sys.meta_path (where implemented)."""
687db96d56Sopenharmony_ci    for finder in sys.meta_path:
697db96d56Sopenharmony_ci        if hasattr(finder, 'invalidate_caches'):
707db96d56Sopenharmony_ci            finder.invalidate_caches()
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_cidef find_loader(name, path=None):
747db96d56Sopenharmony_ci    """Return the loader for the specified module.
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci    This is a backward-compatible wrapper around find_spec().
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci    This function is deprecated in favor of importlib.util.find_spec().
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci    """
817db96d56Sopenharmony_ci    warnings.warn('Deprecated since Python 3.4 and slated for removal in '
827db96d56Sopenharmony_ci                  'Python 3.12; use importlib.util.find_spec() instead',
837db96d56Sopenharmony_ci                  DeprecationWarning, stacklevel=2)
847db96d56Sopenharmony_ci    try:
857db96d56Sopenharmony_ci        loader = sys.modules[name].__loader__
867db96d56Sopenharmony_ci        if loader is None:
877db96d56Sopenharmony_ci            raise ValueError('{}.__loader__ is None'.format(name))
887db96d56Sopenharmony_ci        else:
897db96d56Sopenharmony_ci            return loader
907db96d56Sopenharmony_ci    except KeyError:
917db96d56Sopenharmony_ci        pass
927db96d56Sopenharmony_ci    except AttributeError:
937db96d56Sopenharmony_ci        raise ValueError('{}.__loader__ is not set'.format(name)) from None
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci    spec = _bootstrap._find_spec(name, path)
967db96d56Sopenharmony_ci    # We won't worry about malformed specs (missing attributes).
977db96d56Sopenharmony_ci    if spec is None:
987db96d56Sopenharmony_ci        return None
997db96d56Sopenharmony_ci    if spec.loader is None:
1007db96d56Sopenharmony_ci        if spec.submodule_search_locations is None:
1017db96d56Sopenharmony_ci            raise ImportError('spec for {} missing loader'.format(name),
1027db96d56Sopenharmony_ci                              name=name)
1037db96d56Sopenharmony_ci        raise ImportError('namespace packages do not have loaders',
1047db96d56Sopenharmony_ci                          name=name)
1057db96d56Sopenharmony_ci    return spec.loader
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_cidef import_module(name, package=None):
1097db96d56Sopenharmony_ci    """Import a module.
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci    The 'package' argument is required when performing a relative import. It
1127db96d56Sopenharmony_ci    specifies the package to use as the anchor point from which to resolve the
1137db96d56Sopenharmony_ci    relative import to an absolute import.
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci    """
1167db96d56Sopenharmony_ci    level = 0
1177db96d56Sopenharmony_ci    if name.startswith('.'):
1187db96d56Sopenharmony_ci        if not package:
1197db96d56Sopenharmony_ci            msg = ("the 'package' argument is required to perform a relative "
1207db96d56Sopenharmony_ci                   "import for {!r}")
1217db96d56Sopenharmony_ci            raise TypeError(msg.format(name))
1227db96d56Sopenharmony_ci        for character in name:
1237db96d56Sopenharmony_ci            if character != '.':
1247db96d56Sopenharmony_ci                break
1257db96d56Sopenharmony_ci            level += 1
1267db96d56Sopenharmony_ci    return _bootstrap._gcd_import(name[level:], package, level)
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci_RELOADING = {}
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_cidef reload(module):
1337db96d56Sopenharmony_ci    """Reload the module and return it.
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci    The module must have been successfully imported before.
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci    """
1387db96d56Sopenharmony_ci    try:
1397db96d56Sopenharmony_ci        name = module.__spec__.name
1407db96d56Sopenharmony_ci    except AttributeError:
1417db96d56Sopenharmony_ci        try:
1427db96d56Sopenharmony_ci            name = module.__name__
1437db96d56Sopenharmony_ci        except AttributeError:
1447db96d56Sopenharmony_ci            raise TypeError("reload() argument must be a module")
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci    if sys.modules.get(name) is not module:
1477db96d56Sopenharmony_ci        msg = "module {} not in sys.modules"
1487db96d56Sopenharmony_ci        raise ImportError(msg.format(name), name=name)
1497db96d56Sopenharmony_ci    if name in _RELOADING:
1507db96d56Sopenharmony_ci        return _RELOADING[name]
1517db96d56Sopenharmony_ci    _RELOADING[name] = module
1527db96d56Sopenharmony_ci    try:
1537db96d56Sopenharmony_ci        parent_name = name.rpartition('.')[0]
1547db96d56Sopenharmony_ci        if parent_name:
1557db96d56Sopenharmony_ci            try:
1567db96d56Sopenharmony_ci                parent = sys.modules[parent_name]
1577db96d56Sopenharmony_ci            except KeyError:
1587db96d56Sopenharmony_ci                msg = "parent {!r} not in sys.modules"
1597db96d56Sopenharmony_ci                raise ImportError(msg.format(parent_name),
1607db96d56Sopenharmony_ci                                  name=parent_name) from None
1617db96d56Sopenharmony_ci            else:
1627db96d56Sopenharmony_ci                pkgpath = parent.__path__
1637db96d56Sopenharmony_ci        else:
1647db96d56Sopenharmony_ci            pkgpath = None
1657db96d56Sopenharmony_ci        target = module
1667db96d56Sopenharmony_ci        spec = module.__spec__ = _bootstrap._find_spec(name, pkgpath, target)
1677db96d56Sopenharmony_ci        if spec is None:
1687db96d56Sopenharmony_ci            raise ModuleNotFoundError(f"spec not found for the module {name!r}", name=name)
1697db96d56Sopenharmony_ci        _bootstrap._exec(spec, module)
1707db96d56Sopenharmony_ci        # The module may have replaced itself in sys.modules!
1717db96d56Sopenharmony_ci        return sys.modules[name]
1727db96d56Sopenharmony_ci    finally:
1737db96d56Sopenharmony_ci        try:
1747db96d56Sopenharmony_ci            del _RELOADING[name]
1757db96d56Sopenharmony_ci        except KeyError:
1767db96d56Sopenharmony_ci            pass
177