2023-01-24 21:51:45 -07:00
|
|
|
import importlib
|
|
|
|
|
2024-05-16 17:50:06 -06:00
|
|
|
|
|
|
|
always_true_func = lambda *args, **kwargs: True
|
|
|
|
|
|
|
|
|
2023-01-24 21:51:45 -07:00
|
|
|
class CondFunc:
|
2024-05-16 17:50:06 -06:00
|
|
|
def __new__(cls, orig_func, sub_func, cond_func=always_true_func):
|
2023-01-24 21:51:45 -07:00
|
|
|
self = super(CondFunc, cls).__new__(cls)
|
|
|
|
if isinstance(orig_func, str):
|
|
|
|
func_path = orig_func.split('.')
|
2023-01-25 22:34:38 -07:00
|
|
|
for i in range(len(func_path)-1, -1, -1):
|
2023-01-24 21:51:45 -07:00
|
|
|
try:
|
|
|
|
resolved_obj = importlib.import_module('.'.join(func_path[:i]))
|
|
|
|
break
|
|
|
|
except ImportError:
|
|
|
|
pass
|
2024-01-06 02:17:53 -07:00
|
|
|
try:
|
|
|
|
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))
|
|
|
|
except AttributeError:
|
|
|
|
print(f"Warning: Failed to resolve {orig_func} for CondFunc hijack")
|
|
|
|
pass
|
2023-01-24 21:51:45 -07:00
|
|
|
self.__init__(orig_func, sub_func, cond_func)
|
2024-05-16 17:50:06 -06:00
|
|
|
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)
|