Python-функция соединяет в цепочку неизвестное количество раз - PullRequest
0 голосов
/ 18 июня 2019

Есть ли в Python способ связать одну и ту же функцию неизвестным числом раз для объекта?

Например.Если бы я хотел дважды связать функцию fn на объекте obj, у меня было бы:

obj.fn(**kwargs1).fn(**kwargs2)

Если бы я хотел связать fn пять раз, у меня было бы:

obj.fn(**kwargs1).fn(**kwargs2).fn(**kwargs3).fn(**kwargs4).fn(**kwargs5)

1 Ответ

3 голосов
/ 18 июня 2019

На самом деле вы можете использовать простой цикл 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...