Source code for hydra_slayer.factory

from typing import Any, Callable, Mapping, Tuple, Type, Union
import functools
import inspect

__all__ = ["call_meta_factory", "partial_meta_factory", "default_meta_factory"]

Factory = Union[Type, Callable[..., Any]]
MetaFactory = Callable[[Factory, Tuple, Mapping], Any]


[docs]def call_meta_factory(factory: Factory, args: Tuple, kwargs: Mapping): """Creates a new instance from ``factory``. Args: factory: factory to create instance from args: \*args to pass to the factory kwargs: \*\*kwargs to pass to the factory Returns: Instance. """ return factory(*args, **kwargs)
[docs]def partial_meta_factory(factory: Factory, args: Tuple, kwargs: Mapping): """ Returns a new partial object which when called will behave like func called with the positional arguments ``args`` and keyword arguments ``kwargs``. Args: factory: factory to create instance from args: \*args to merge into the factory kwargs: \*\*kwargs to merge into the factory Returns: Partial object. """ return functools.partial(factory, *args, **kwargs)
[docs]def default_meta_factory(factory: Factory, args: Tuple, kwargs: Mapping): """ Creates a new instance from ``factory`` if ``factory`` is class (like :py:func:`call_meta_factory`), else returns a new partial object (like :py:func:`partial_meta_factory`). Args: factory: factory to create instance from args: \*args to pass to the factory kwargs: \*\*kwargs to pass to the factory Returns: Instance. """ if inspect.isfunction(factory): return partial_meta_factory(factory, args, kwargs) return call_meta_factory(factory, args, kwargs)