--- /dev/null
+# ModuleSpec, ModuleType, Loader are part of a dependency cycle.\r
+# They are officially defined/exported in other places:\r
+#\r
+# - ModuleType in types\r
+# - Loader in importlib.abc\r
+# - ModuleSpec in importlib.machinery (3.4 and later only)\r
+\r
+from abc import ABCMeta\r
+import sys\r
+from typing import Any, Dict, List, Optional\r
+\r
+class ModuleSpec:\r
+ def __init__(self, name: str, loader: Optional['Loader'], *,\r
+ origin: Optional[str] = ..., loader_state: Any = ...,\r
+ is_package: Optional[bool] = ...) -> None: ...\r
+ name = ... # type: str\r
+ loader = ... # type: Optional[Loader]\r
+ origin = ... # type: Optional[str]\r
+ submodule_search_locations = ... # type: Optional[List[str]]\r
+ loader_state = ... # type: Any\r
+ cached = ... # type: Optional[str]\r
+ parent = ... # type: Optional[str]\r
+ has_location = ... # type: bool\r
+\r
+class ModuleType:\r
+ __name__ = ... # type: str\r
+ __file__ = ... # type: str\r
+ __dict__ = ... # type: Dict[str, Any]\r
+ __loader__ = ... # type: Optional[Loader]\r
+ __package__ = ... # type: Optional[str]\r
+ __spec__ = ... # type: Optional[ModuleSpec]\r
+ def __init__(self, name: str, doc: Optional[str] = ...) -> None: ...\r
+\r
+class Loader(metaclass=ABCMeta):\r
+ def load_module(self, fullname: str) -> ModuleType: ...\r
+ def module_repr(self, module: ModuleType) -> str: ...\r
+ def create_module(self, spec: ModuleSpec) -> Optional[ModuleType]: ...\r
+ # Not defined on the actual class for backwards-compatibility reasons,\r
+ # but expected in new code.\r
+ def exec_module(self, module: ModuleType) -> None: ...\r