# 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: ModuleType, cls_type: Type[ClassType]) → Type[ClassType] | None

  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: 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.

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 implement `iter_modules()`. But it is still possible to find all potential modules by iterating through `toc`, 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`.