Python 从数组生成函数

Python generate functions from array

我想创建多个具有相似结构的函数。并且一个一个地打出来似乎并不聪明,因为它显然违反了不要重复自己(DRY)原则。

情况是这样的,我有一个数组function_names = ["func1", "func2", … , "func10"]。此外,我希望在这些具有不同操作的函数中使用 if、elif 和 else 语句。这些函数在 class 内。目标是简化这个结构

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不变。

您可以简单地向函数传递一个函数并执行回调:

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")

你可以编写一个函数,其中 return 一个函数:

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)

我会使用一个字典来映射你想用 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))

您可以在 class 之外定义您的 handler 并将其用作外包,您的 "parameters""actions"