Source code for autowire.impl.function

"""
impl.function
=============

Function implementation classes

"""
import abc
import contextlib
import functools
import types

from autowire.base import BaseResource, BaseContext, Implementation


# (FunctionType, BaseResource, BaseContext) -> ContextManager
Evaluator = types.FunctionType


[docs]class FunctionImplementation(Implementation, metaclass=abc.ABCMeta): """ Implementation with wrapping function and evaluator :param function: function to be wrapped. :param evaluator: function evaluator for reifying. :type evaluator: (Function, BaseResource, BaseContext) -> ContextManager """ def __init__(self, function: types.FunctionType, evaluator: Evaluator): super().__init__() self.function = function self.evaluator = evaluator functools.update_wrapper(self, function) def __call__(self, *args, **kwargs): return self.function(*args, **kwargs) @contextlib.contextmanager
[docs] def reify(self, resource: BaseResource, context: BaseContext): with self.evaluator(self.function, resource, context) as value: yield value