Python函数链接次数未知

时间:2019-06-18 18:53:38

标签: python chaining

Python中是否有一种方法可以在对象上无数次地链接相同的函数?

例如。如果我想在对象fn上将函数obj链接两次,我将:

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

如果我想将fn链接五次,我将:

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

1 个答案:

答案 0 :(得分:3)

您实际上可以使用一个简单的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