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_a
和condition_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)
我会使用一个字典来映射你想用 action1
和 random_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"。
我想创建多个具有相似结构的函数。并且一个一个地打出来似乎并不聪明,因为它显然违反了不要重复自己(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_a
和condition_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)
我会使用一个字典来映射你想用 action1
和 random_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"。