На самом деле вы можете использовать простой цикл for, который перебирает список аргументов, применяет каждый аргумент к объекту и переназначает результаты обратно объекту
for args in list_of_args:
obj = obj.fn(*args)
Например, я могу использовать эту логику для цепочки string.replace
следующим образом
obj = 'aaaccc'
list_of_args = [['a','b'], ['c','d']]
for args in list_of_args:
obj = obj.replace(*args)
print(obj)
А на выходе будет
bbbddd
То же самое, что и 'aaabbb'.replace('a','b').replace('c','d')
Или, возможно, мы также можем использовать рекурсивный метод, который принимает объект, и счетчик, который служит индексом текущего аргумента, который должен быть применен, и количество раз, которое функция должна быть запущена
#fn is either defined, or imported from outside
def chain_func(obj, counter, max_count):
#If counter reaches max no of iterations, return
if counter == max_count:
return obj
#Else recursively apply the function
else:
return chain_func(obj.fn(list_of_args[counter]), counter+1, max_count)
#To call it twice
list_of_args = [kwargs1, kwargs2]
chain_func(obj, 0, 2)
Например, я могу использовать эту логику для цепочки string.replace следующим образом
def chain_func(obj, counter, max_count):
#If counter reaches max no of iterations, return
if counter == max_count:
return obj
#Else recursively apply the function
else:
return chain_func(obj.replace(*list_of_args[counter]), counter+1, max_count)
list_of_args = [['a','b'], ['c','d']]
print(chain_func('aaaccc', 0, 2))
А на выходе будет
bbbddd