【问题标题】:Best way to execute combination of different functions in Python在 Python 中执行不同函数组合的最佳方法
【发布时间】:2020-12-29 22:09:54
【问题描述】:

假设定义了n函数,每个函数代表一些动作,而函数代表这些动作的组合:

def all_actions():
    action1()
    action2()
    action3()
    ...
    actionN()

def combination_of_1_and_2():
    action1()
    action2()

def combination_of_1_and_3():
    action1()
    action3()

def combination_of_1_2_and_3():
    action1()
    action2()
    action3()

.....

如何在不为每个组合编写单独的函数的情况下在 Python 中实现此功能?

更新

如果您将此问题视为基于意见的问题,则必须将best practices 上的任何问题视为基于意见的问题并且不允许。但是定义说:Coding best practices are a set of informal rules that the software development community employ to help improve the quality of software.,这意味着它们都是非正式的并且基于社区意见。

【问题讨论】:

    标签: python function design-patterns functional-programming


    【解决方案1】:

    实现此目的的一种动态方法是将所有函数的引用存储在列表(或字典)中,并根据索引调用函数。例如::

    my_action = [action0, action1, action2, .... , actionN]
    
    my_action[1]()   # perform action1()
    my_action[N]()   # perform actionN()
    

    并定义单个函数以根据索引执行操作:

    def do_action(actions):
        for action in actions:
            my_action[action]()
    

    使用do_action 函数,而不是为所有动作组合定义自定义函数,您可以只传递这些动作的索引。例如:

    do_action([1, 3, 5])
    
    # Equivalent of:
    #    action1()
    #    action3()
    #    action5()
    

    而要执行所有操作,您只需传递range(N):

    do_action(range(N))
    

    【讨论】:

    • 是否可以使用python内置的itertools的组合和排列方式?
    • 我不认为 OP 的意图是找到所有可能的组合。我认为 OP 正在寻找一种优雅的方式来访问不同的操作组合,而无需一次又一次地复制/编写相同的东西,我试图在这里介绍
    • 虽然有人不喜欢我的问题,但我认为这是很好的讨论机会。如果动作采用不同的参数怎么办?
    • 具有不同参数的操作将完全改变您最初发布的问题的上下文,并且此处发布的两个答案都将无效。我认为您需要将其作为一个单独的问题发布。
    【解决方案2】:

    如果将所有函数放入一个数组中,则可以简单地根据数组索引调用函数。因此,要进行组合,您可以使用如下函数:

    def combination(fns):
        for i in fns:
            actions[i-1]()
    

    例如:

    def action1():
        print('action1')
        
    def action2():
        print('action2')
        
    def action3():
        print('action3')
        
    actions = [action1, action2, action3]
        
    def combination(fns):
        for i in fns:
            actions[i-1]()
            
    combination([1, 3])
    

    输出

    action1
    action3
    

    你可以这样写all_actions:

    def all_actions():
        for i in range(len(actions)):
            actions[i]()
    

    您也可以只将一组操作传递给combination 函数。例如:

    def combination(fns):
        for fn in fns:
            fn()
            
    combination([action1, action2])
    

    输出:

    action1
    action2
    

    【讨论】:

    • 虽然有人不喜欢我的问题,但我认为有很好的讨论机会。如果动作采用不同的参数怎么办?
    • 要做到这一点,您可能已经到了这样的地步:无论如何单独写出函数调用同样容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2021-04-02
    • 2010-12-14
    • 2010-11-29
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多