31 lines
1.0 KiB
Python
31 lines
1.0 KiB
Python
|
# -*- encoding: utf-8 -*-
|
||
|
|
||
|
from inspect import getfullargspec
|
||
|
from typing import Callable
|
||
|
from typing import Dict
|
||
|
|
||
|
|
||
|
class KeywordArgumentsMapper(object):
|
||
|
def __init__(self, **kwargs_changes: Dict[str, Callable]):
|
||
|
for oldkw, mapper in kwargs_changes.items():
|
||
|
assert isinstance(oldkw, str)
|
||
|
assert callable(mapper)
|
||
|
self.kwargs_changes = kwargs_changes
|
||
|
|
||
|
def __call__(self, c):
|
||
|
return KeywordArgumentsMapperConfigured(c, **self.kwargs_changes)
|
||
|
|
||
|
|
||
|
class KeywordArgumentsMapperConfigured(object): # Don't instantiate this class manually
|
||
|
def __init__(self, clb: Callable, **kwargs_changes: Dict[str, Callable]):
|
||
|
self.kwargs_changes = kwargs_changes
|
||
|
self.callback = clb
|
||
|
|
||
|
def __call__(self, *args, **kwargs):
|
||
|
newkwargs = kwargs.copy()
|
||
|
for kw, mapper in self.kwargs_changes.items():
|
||
|
newkwargs[kw] = mapper(**{
|
||
|
k: kwargs[k]
|
||
|
for k in getfullargspec(mapper).args
|
||
|
})
|
||
|
return self.callback(*args, **newkwargs)
|