tl; dr:编写out(n)
函数而不是,out1(), out2(), ..., outN()
并且不要理会此hack。
我无法想象在实际情况中会出现这个问题的合理情况。请重新考虑问题的体系结构;可能会有一个更好的方法(因为将它们存储在列表中意味着除索引外,函数没有其他意义;例如,我只能想象如果要创建该函数,则可以这样做)一堆动态生成的thunk,它们的时间顺序很重要,或者类似。尤其是正在阅读此答案的任何新手用户,都可以考虑制作一个可以处理所有内容的更通用的功能,或者将更多的标识信息与每个功能相关联,或者将其作为类的一部分进行粘贴等。
就是说,这就是你要怎么做。
myFuncs = [f0,f1,f2]
myFuncs[2](...) #calls f2
要么
myFuncs = {'alice':f1, 'bob':f2}
myFuncs['alice'](...) #calls f1
这只是一步中的以下两个步骤:
myFuncs = [f0,f1,f2]
f = myFuncs[i]
f(...) #calls fi
或者,如果您没有上述OP所述的函数“ myFunc”的注册表,则可以使用globals(),尽管它的形式极其骇人,并且应避免使用(除非您希望这些函数在模块名称空间中可用,在这种情况下也许很好…但是这种情况很少见,您可能宁愿先在子模块中定义这些函数,然后再对from mysubmodule import *
它们进行定义,而后者又会有些皱眉):
def fN(n):
return globals()['f'+str(n)]
def f2():
print("2 was called!")
fN(2)(...) #calls f2
这是另外两个想法(接受答案后再添加两个想法):
您还可以这样创建一个装饰器:
>>> def makeRegistrar():
... registry = {}
... def registrar(func):
... registry[func.__name__] = func
... return func # normally a decorator returns a wrapped function,
... # but here we return func unmodified, after registering it
... registrar.all = registry
... return registrar
并像这样使用它:
>>> reg = makeRegistrar()
>>> @reg
... def f1(a):
... return a+1
...
>>> @reg
... def f2(a,b):
... return a+b
...
>>> reg.all
{'f1': <function f1 at 0x7fc24c381958>, 'f2': <function f2 at 0x7fc24c3819e0>}
那么您可以调用reg.all [‘f1’]。您可以调整reg
装饰器以跟踪索引并执行以下操作:
registry = []
index = int(re.regextofindthenumber(func.__name__))
if not index==len(registry):
raise Exception('Expected def f{} but got def f{}')
else:
registry[index] = func
另外,为了避免globals()
,您可以定义一个类:
class Funcs(object):
def f1():
...
def f2():
...
def num(n):
[code goes here]
如果您的功能数量很少,您可以选择['f1','f2','f3'][i]
。
当然,如果没有更多的信息,所有这些建议都只会忽略真正的问题:这种情况永远都不会出现,并且可能表示存在严重的体系结构缺陷,而您可能希望有一些东西(使用示例),例如:
# a possibly-better world
def out(n):
# output to N, whatever that means
而不是
# what you have Now
def out1():
# output to 1
def out2():
# output to 2
def outN(n):
# ???