“”” 我有三个python函数:a(),b(),c(),它们具有几乎相同的处理流程。不同的地方只是'x','y','z',这三个只是其中的一部分函数名称或变量名称。 如何友好而优雅地编写这些功能? “”“
def a():
do_x()
some = var1['x_id']
var2['x_result'] = x_process()
...
def b():
do_y()
some = var1['y_id']
var2['y_result'] = y_process()
...
def c():
do_z()
some = var1['z_id']
var2['z_result'] = z_process()
...
答案 0 :(得分:3)
这三个函数基本相同,除了它们调用的函数以及它们使用的映射索引。因此,您只需将被调用函数和映射索引作为参数传递给统一函数:
def do_something(do_fun, id1, id2, process_fun):
do_fun()
some = var1[id1]
var2[id2] = process_fun()
do_something(do_x, 'x_id', 'x_result', x_process)
答案 1 :(得分:2)
最好的方法不仅是重写这些函数,还要重构它们使用的各种项目,方法是将名称中包含x,y或z的变量更改为映射字符串的结构中存储的项目" x"," y"," z"适当的东西。像这样:
do_funcs = {'x': do_x, 'y': do_y, 'z': do_z}
# make ids whatever is in var1
# but with the keys as "x", "y", "z" instead of "x_id", "y_id", "z_id"
ids = {}
# make resu;ts whatever is in var2
# but with the keys as "x", "y", "z" instead of "x_result", "y_result", "z_result"
results = {}
processes = {'x': x_process, 'y': y_process, 'z': z_process}
然后你可以编写一个函数:
def do_stuff(which):
do_funcs[which]()
some = ids[which]
results[which] = processes[which]()
然后您拨打do_stuff('x')
,do_stuff('y')
或do_stuff('z')
。
这只是一个草图,因为究竟如何做到最好取决于定义其他事物的位置以及它们如何被使用。但是,基本的想法是不使用变量名称的部分作为参数。如果您发现自己有很多名为x_blah
,y_blah
和z_blah
的内容,甚至是"x_id"
和"y_id"
等词组,您应该尝试重组因为它们是由单个值直接参数化的数据结构(例如,字符串"x"
,"y"
或"z"
)。
答案 2 :(得分:0)
您可以使用lambda函数:
def a():
print 'a'
def b():
print 'b'
def c():
print 'c'
def a_process():
print 'a'
def b_process():
print 'b'
def c_process():
print 'c'
def func(x):
do = {'a':lambda: a(), 'b':lambda: b(), 'c':lambda:c()}
do[x]()
some = var1['{}_id'.format(x)]
process = {'a':lambda: a_process(), 'b':lambda: b_process(), 'c':lambda:c_process()}
var2['{}_result'.format(x)] = process[x]()
func('c')