| import importlib | |
| class CondFunc: | |
| def __new__(cls, orig_func, sub_func, cond_func): | |
| self = super(CondFunc, cls).__new__(cls) | |
| if isinstance(orig_func, str): | |
| func_path = orig_func.split('.') | |
| for i in range(len(func_path)-1, -1, -1): | |
| try: | |
| resolved_obj = importlib.import_module('.'.join(func_path[:i])) | |
| break | |
| except ImportError: | |
| pass | |
| for attr_name in func_path[i:-1]: | |
| resolved_obj = getattr(resolved_obj, attr_name) | |
| orig_func = getattr(resolved_obj, func_path[-1]) | |
| setattr(resolved_obj, func_path[-1], lambda *args, **kwargs: self(*args, **kwargs)) | |
| self.__init__(orig_func, sub_func, cond_func) | |
| return lambda *args, **kwargs: self(*args, **kwargs) | |
| def __init__(self, orig_func, sub_func, cond_func): | |
| self.__orig_func = orig_func | |
| self.__sub_func = sub_func | |
| self.__cond_func = cond_func | |
| def __call__(self, *args, **kwargs): | |
| if not self.__cond_func or self.__cond_func(self.__orig_func, *args, **kwargs): | |
| return self.__sub_func(self.__orig_func, *args, **kwargs) | |
| else: | |
| return self.__orig_func(*args, **kwargs) | |