0

我想做以下功能:

 1)input is a number. 
 2)functions are indexed, return a function whose index matches given number

这是我想出的:

def foo_selector(whatfoo):
    def foo1():
        return
    def foo2():
        return
    def foo3():
        return
    ...

    def foo999():
        return

    #something like return foo[whatfoo]

问题是,我怎样才能索引函数(foo#)?我可以通过 dir() 看到函数 foo1 到 foo999。但是, dir() 返回此类函数的名称,而不是函数本身。在示例中,那些 foo 函数没有做任何事情。但是在我的程序中,它们执行不同的任务,我无法自动生成它们。我自己写的,必须以他们的名字归还。

4

3 回答 3

4

使用装饰器来累积函数列表。

func_list = []

def listed_func(func):
    func_list.append(func)
    return func

@listed_func
def foo1():
   pass

@listed_func
def foo2():
   pass

现在您可以通过列表中的索引轻松访问函数。

如果要按名称访问函数,还可以创建字典:

func_dict = {}

def collected_func(func):
    func_dict[func.__name__] = func
    return func

或者从名称中提取索引,并将其用作 dict 键(由于 dicts 没有排序,如果您想以某种顺序迭代它们,则需要对键进行排序):

func_dict = {}

def collected_func(func):
    key = int("".join(c for c in func.__name__ if c.isdigit()))
    func_dict[key] = func
    return func

或者显式地将索引号传递给装饰器:

func_dict = {}

def collected_func(key):
    def decorator(func):
        func_dict[key] = func
        return func
    return decorator

@collected_func(12)
def foo():
    pass
于 2012-12-02T05:01:10.123 回答
0

您可以简单地将所有函数放入一个数组中,例如:

def foo_selector(whatfoo):
    def foo1():
        return
    def foo2():
        return
    def foo3():
        return
    ...

    def foo999():
        return

    foo_list = [
        foo1,
        foo2,
        ...
        foo999
    ]

    return foo_list[whatfoo]
于 2012-12-02T03:40:58.210 回答
0

以下是您可以使用的其他几种方法:

eval("foo{}()".format(whatfoo))

或者

locals()['foo{}'.format(whatfoo)]

于 2012-12-02T04:33:28.917 回答