您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Python中按数组索引调用函数

在Python中按数组索引调用函数

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):
    # ???
python 2022/1/1 18:27:50 有426人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶