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(),尽管它的形式极其骇人,并且应避免使用(除非您希望这些函数在模块名称空间中可用,在这种情况下也许很好…但是这种情况很少见,您可能宁愿先在子模块中定义这些函数,然后再对
frommysubmodule 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): [pre goes here]
如果您的功能数量很少,您可以选择
['f1','f2','f3'][i]。
当然,如果没有更多的信息,所有这些建议都只会忽略真正的问题:这种情况永远都不会出现,并且可能表示存在严重的体系结构缺陷,而您可能希望有一些东西(使用示例),例如:
# a possibly-better worlddef out(n): # output to N, whatever that means
而不是
# what you have nowdef out1(): # output to 1def out2(): # output to 2def outN(n): # ???



