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

在python中调用100个不同函数的优雅/python方式?,python,Python,我有一百个唯一的函数,让我们称它们为func{I},其中{I}是函数的编号,例如func{u 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 lis

我有一百个唯一的函数,让我们称它们为func{I},其中{I}是函数的编号,例如func{u 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似乎是唯一的方法。即使如此,这段代码似乎可以变得更优雅、更通俗,而这可能不是最有效的方式

就这个问题而言,可以安全地假设每个func{i}都是完全唯一的,没有办法让它们共享代码,也没有办法将其压缩为少于100个唯一的函数

for item in list:
    for i in range(100):
        values[i] = locals()["func_%d" % (i)](item, values[i])
根据函数的定义方式,可以使用局部变量或全局变量,也可以使用getattrsome\u模块func\ud%i


根据函数的定义方式,您可以使用局部变量或全局变量,也可以使用getattrsome模块,func\u%d%i。

如果函数都在对象中定义了作用域,则与all\u func一样,您可以使用getattr。。要获得该函数,请执行以下操作:

for items in list:
    for i in range(100):
        values[i] = getattr(all_func,'func_%s'%i)(item,values[i])
这将更加安全,因为:

您可以控制所有函数中的元素;和 您使用反馈的元素执行一个调用,所以想要注入任意代码的黑客将面临更困难的任务。
然而,一开始就定义数百个函数是相当不雅观的。这通常意味着有一个参数,使得函数42PARA、表可以被推广到函数42、PARA、米等。你应该考虑重新设计你的代码。

< P>说函数都在对象中,比如ALE FUNC,可以使用GETATOR。要获得该函数,请执行以下操作:

for items in list:
    for i in range(100):
        values[i] = getattr(all_func,'func_%s'%i)(item,values[i])
这将更加安全,因为:

您可以控制所有函数中的元素;和 您使用反馈的元素执行一个调用,所以想要注入任意代码的黑客将面临更困难的任务。
然而,一开始就定义数百个函数是相当不雅观的。这通常意味着有一个参数,使得函数42PARA,米可以推广到函数42,PARA,米等。你应该考虑重新设计你的代码。

函数是否在某个范围内?这些函数从哪里来的?你能生成这些吗?它们都列在一个模块中吗?它们是我在范围内单独编写的函数,但它们与问题并不相关。这些函数是否在某个地方有范围?所有这些函数最初来自哪里?你能生成这些吗?它们都列在一个模块中吗?它们是我在范围内单独编写的函数,但它们与问题并不相关。谢谢,这可能是它能得到的最优雅的函数。不幸的是,我不能真正概括这些函数,但将它们全部放在一个对象中,然后像这样调用它们是有意义的。它类似于eval解决方案,但实际上并不调用eval。@暂停:它给了您更多的控制,因此比eval更安全,但请注意,这仍然不是一种好方法。此外,这可能会有问题:例如,如果您决定将fuc_{i}重命名为foo_{i},IDE可能不会正确地重构它。谢谢,这可能是它能得到的最优雅的。不幸的是,我不能真正概括这些函数,但将它们全部放在一个对象中,然后像这样调用它们是有意义的。它类似于eval解决方案,但实际上并不调用eval。@暂停:它给了您更多的控制,因此比eval更安全,但请注意,这仍然不是一种好方法。此外,这可能会有问题:例如,如果您决定将fuc_{i}重命名为foo_{i},IDE可能不会正确地重构它。