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.