patroni.dynamic_loader module¶
Helper functions to search for implementations of specific abstract interface in a package.
-
patroni.dynamic_loader.
find_class_in_module
(module: module, cls_type: Type[ClassType]) → Optional[Type[ClassType]]¶ Try to find the implementation of cls_type class interface in module matching the module name.
Parameters: - module – imported module.
- cls_type – a class type we are looking for.
Returns: class with a name matching the name of module that implements cls_type or
None
if not found.
-
patroni.dynamic_loader.
iter_classes
(package: str, cls_type: Type[ClassType], config: Union[Config, Dict[str, Any], None] = None) → Iterator[Tuple[str, Type[ClassType]]]¶ Attempt to import modules and find implementations of cls_type that are present in the given configuration.
Note
If a module successfully imports we can assume that all its requirements are installed.
Parameters: - package – a package name to search modules in, e.g.
patroni.dcs
. - cls_type – a class type we are looking for.
- config – configuration information with possible module names as keys. If given, only attempt to import
modules defined in the configuration. Else, if
None
, attempt to import any supported module.
Yields: a tuple containing the module
name
and the imported class object.- package – a package name to search modules in, e.g.
-
patroni.dynamic_loader.
iter_modules
(package: str) → List[str]¶ Get names of modules from package, depending on execution environment.
Note
If being packaged with PyInstaller, modules aren’t discoverable dynamically by scanning source directory because
importlib.machinery.FrozenImporter
doesn’t implementiter_modules()
. But it is still possible to find all potential modules by iterating throughtoc
, which contains list of all “frozen” resources.Parameters: package – a package name to search modules in, e.g. patroni.dcs
.Returns: list of known module names with absolute python module path namespace, e.g. patroni.dcs.etcd
.