优雅/ pythonic方式在python中调用一百个不同的函数?

时间:2017-01-24 16:12:31

标签: python

我有一百个独特的函数,我们称之为func_{i}(),其中{i}是函数的编号,例如func_56()。我有一个我基本上需要做的循环:

for item in list:
    values[0] = func_0(item,values[0]) 
    values[1] = func_1(item,values[1])
    ...
    values[99] = func_99(item,values[99])

最狡猾的做法是什么?我能想到:

for item in list:
    for i in range(100):
        values[i] = eval('func_' + str(i) + '(item, values[i]')

eval()通常不被视为良好做法。

可替换地:

function_list = [func_0, func_1 .... ] # is there a way of doing this programmatically?
for item in list:
    for i in range(100):
        values[i] = function_list[i](item, values[i])

但是构建函数列表仍然看起来很难看,eval()似乎是唯一的方法。即便如此,这个片段似乎可以变得更加优雅和pythonic,这可能不是最有效的做事方式。

出于这个问题的目的,可以安全地假设每个func_{i}()都是完全唯一的,并且无法让它们共享代码,也无法将其压缩到少于100个独特函数。

2 个答案:

答案 0 :(得分:3)

for item in list:
    for i in range(100):
        values[i] = locals()["func_%d" % (i)](item, values[i])

根据您的功能定义方式,您可以使用locals()globals()getattr(some_module, "func_%d" % (i))

答案 1 :(得分:2)

假设函数都在一个对象中,例如all_func,您可以使用getattr(..)来获取函数:

for items in list:
    for i in range(100):
        values[i] = getattr(all_func,'func_%s'%i)(item,values[i])

从那以后会更安全:

  1. 您可以控制all_func中的哪些元素;和
  2. 你使用feeded元素执行一次调用,因此一个想要注入任意代码的黑客将会有更难的工作。
  3. 然而,开始定义数百个函数是相当不优雅的。这通常意味着有一个参数,func_42(para,meter)可以推广到func(42,para,meter)等。您应该考虑重新设计代码。