Python从数组生成函数

时间:2018-08-16 13:44:12

标签: python function dry

我想创建具有相似结构的多个功能。并且一一列出它们似乎并不聪明,因为它显然违反了“不要重复自己做”的原则。

这种情况使得我有一个数组function_names = ["func1", "func2", … , "func10"]。另外,我想在这些函数中使用不同的操作执行if,elif和else语句。这些函数在一个类中。目的是简化这种结构

class MainClass:


    def func1(self):
        if condition_a:
            return action1(parameter1)
        elif condition_b:
            return random_action1(random_parameter1)
        else:
            print("There is something wrong inside func1")

     def func2(self):
        if condition_a:
            return action2(parameter2)
        elif condition_b:
            return random_action2(random_parameter2)
        else:
            print("There is something wrong inside func2")

     # Same structure of functions goes on

条件condition_acondition_b是不变的。

3 个答案:

答案 0 :(得分:2)

您可以简单地将函数传递给函数并执行回调:

def generic_func(action, random_action, parameter, random_parameter):
    if condition_a:
        return action(parameter)
    elif condition_b:
        return random_action(random_parameter)
    else:
        print("There is something wrong")

答案 1 :(得分:0)

您可以编写返回函数的函数:

class MainClass():
    action1 = None
    random_action1 = None
    def mother_func(action, random_action):
        def func(self):
            if condition_a:
                return action(self.parameter)
            elif condition_b:
                return random_action(self.random_parameter)
            else:
                print("There is something wrong inside func")
        return func

    func1 = mother_func(action1, random_action1)

答案 2 :(得分:0)

我会使用一个字典,该字典将映射您想对action1random_action1以及您的参数等等进行的操作...

class MainClass:

    action1 = lambda x: ()
    random_action_1 = lambda x: ()
    parameter1 = 0
    random_parameter1 = 1

    action2 = lambda x: ()
    random_action_2 = lambda x: ()
    parameter2 = 0
    random_parameter2 = 1

    handler = {
        'func1' : {
            'action': action1,
            'random_action': random_action_1,
            'parameter': parameter1,
            'random_parameter': random_parameter1
        },

        'func2': {
            'action': action2,
            'random_action': random_action_2,
            'parameter': parameter2,
            'random_parameter': random_parameter2
        },
    }

    def gfunc(self, func):
        if condition_a:
            return self.handler[func]['action'](self.handler[func]['parameter'])
        elif condition_b:
            return self.handler[func]['random_action'](self.handler[func]['random_parameter'])
        else:
            print("There is something wrong inside {}".format(func))

您可以在类之外定义handler并将其用作外包,您的“参数” “操作” 也是如此。