Source code for zfit.util.temporary

from typing import Callable, Any


[docs]class TemporarilySet: def __init__(self, value: Any, setter: Callable, getter: Callable, setter_args=None, setter_kwargs=None, getter_args=None, getter_kwargs=None): """Temporarily set `value` with `setter` and reset to the old value after leaving the context. This class can be used to have a setter that can permanently set a value *as well as* just for the time inside a context manager. The usage is as follows: >>> class SimpleX: >>> def __init__(self): >>> self.x = None >>> def _set_x(self, x): >>> self.x = x >>> def get_x(self): >>> return self.x >>> def set_x(self, x): >>> return TemporarilySet(value=x, setter=self._set_x, getter=self.get_x) >>> simple_x = SimpleX() Now we can either set x permanently >>> simple_x.set_x(42) >>> print(simple.x) 42 or temporarily >>> with simple_x.set_x(13) as value: >>> print("Value from contextmanager:", value) >>> print("simple_x.get_x():", simple_x.get_x()) 13 13 and is afterwards unset again >>> print(simple.x) 42 Args: value (Any): The value to be (temporarily) set (and returned if a context manager is applied). setter (Callable): The setter function with a signature that is compatible to the call: `setter(value, *setter_args, **setter_kwargs)` getter (Callable): The getter function with a signature that is compatible to the call: `getter(*getter_args, **getter_kwargs)` setter_args (List): A list of arguments given to the setter setter_kwargs (Dict): A dict of keyword-arguments given to the setter getter_args (List): A list of arguments given to the getter getter_kwargs (Dict): A dict of keyword-arguments given to the getter """ self.setter = setter self.setter_args = [] if setter_args is None else setter_args self.setter_kwargs = {} if setter_kwargs is None else setter_kwargs self.getter_args = [] if getter_args is None else getter_args self.getter_kwargs = {} if getter_kwargs is None else getter_kwargs self.getter = getter self.value = value self.old_value = self.getter(*self.getter_args, **self.getter_kwargs) self.setter(self.value, *self.setter_args, **self.setter_kwargs) def __enter__(self): return self.value def __exit__(self, exc_type, exc_val, exc_tb): self.setter(self.old_value, *self.setter_args, **self.setter_kwargs)