我有以下10个功能:
def function1(data1,data2):
...
return value
def function2(data1,data2):
...
return value
...
def function10(data1,data2):
...
return value
我想在需要时分别使用这些功能,但是 在计算属性并追加到列表的管道中。 像这样:
collecting_list = []
for idx in range(10):
collecting_list.append(function1(data1[idx],data2[idx]))
collecting_list.append(function2(data1[idx],data2[idx]))
collecting_list.append(function3(data1[idx],data2[idx]))
collecting_list.append(function4(data1[idx],data2[idx]))
collecting_list.append(function5(data1[idx],data2[idx]))
collecting_list.append(function6(data1[idx],data2[idx]))
collecting_list.append(function7(data1[idx],data2[idx]))
collecting_list.append(function8(data1[idx],data2[idx]))
collecting_list.append(function9(data1[idx],data2[idx]))
collecting_list.append(function10(data1[idx],data2[idx])
很明显,我需要一些属性来遍历函数名,但是我之前从未遇到过这个问题,只是想知道是否可以在不进行硬编码和仅调整函数编号的情况下就可以在循环中调用这些函数(例如function1 (),function2(),... function10())。 提示和想法表示赞赏!
答案 0 :(得分:0)
嗯,确定吗?
import sys
import types
module_name = sys.modules[__name__]
def function1(data1, data2):
return ("func1", data1 + data2)
def function2(data1, data2):
return ("func2", data1 + data2)
def function3(data1, data2):
return ("func3", data1 + data2)
def function4(data1, data2):
return ("func4", data1 + data2)
def function5(data1, data2):
return ("func5", data1 + data2)
def get_functions():
func_list = list()
for k in sorted(module_name.__dict__.keys()):
if k.startswith('function'):
if isinstance(module_name.__dict__[k], types.FunctionType):
func_list.append(module_name.__dict__[k])
return func_list
def get_functions_2():
func_list = list()
for itr in range(1, 100):
try:
func_list.append(getattr(module_name, "function%s" % itr))
except:
break
return func_list
def run_pipeline(function_list):
collecting_list = list()
for idx, func in enumerate(function_list):
collecting_list.append(func(idx, idx))
return collecting_list
if __name__ == "__main__":
funcs = get_functions()
results = run_pipeline(funcs)
print(results)
输出:
[('func1', 0), ('func2', 2), ('func3', 4), ('func4', 6), ('func5', 8)]
注意:如果我试图构建动态计算管道,我可能不会这样做,但是您可以使用此方法。从理论上讲,您可以为每个管道创建一个文件并命名它们以使用此方法吗?
编辑:每个请求添加了get_functions_2
答案 1 :(得分:0)
使用lambda
和exec
。
您可以拥有一个由函数名称组成的字符串数组,以及可以返回数据的lambda函数,如下所示。使用lambda函数,您可以一次又一次地重复使用相同名称的dataX,并通过适当的实现获得所需的正确数据。下面是一个非常基本的抽象示例:
import random
def getData1():
return random.randint(1, 10)
def getData2():
return random.randint(11, 20)
def function1(data1):
print("f1, {}".format(data1))
def function2(data1, data2):
print("f2, {} and {}".format(data1, data2))
data1 = lambda: getData1() # these can be any function that serves as the
data2 = lambda: getData2() # source for your data. using lambda allows for
# anonymization and reuse
functionList = ["function1({})".format(data1()), "function2({},{})".format(data1(), data2())]
for f in functionList:
exec(f)
function1(data1())
您可能会问为什么不只在函数列表中使用getData1()而不是data1,答案与参数有关。如果getDataX函数需要参数,则不需要每次更改参数名称时都计算functionList。这是使用lambda
和exec
的好处之一。