【问题标题】:Python generate functions from arrayPython从数组生成函数
【发布时间】:2018-08-16 13:44:12
【问题描述】:

我想创建多个具有相似结构的函数。而且一个一个地打出来似乎并不聪明,因为它显然违反了不要重复自己(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 是不变的。

【问题讨论】:

  • 什么是action1,什么是parameter1?它们在哪里被定义?它们是函数的变量吗?
  • 您可以将action 作为另一个参数传递。函数是 Python 中的一等公民,可以作为参数传递

标签: python function dry


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可以编写一个返回函数的函数:

    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)
    

    【讨论】:

      【解决方案3】:

      我会使用一个字典来映射你想用 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 并将其用作外包,您的“参数”“操作” 也是如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-07
        • 2017-03-17
        • 2022-12-03
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 2022-06-13
        • 1970-01-01
        相关资源
        最近更新 更多