我想做以下功能:
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函数没有做任何事情。但是在我的程序中,它们执行不同的任务,我无法自动生成它们。我自己写的,不得不按照他们的名字归还。
答案 0 :(得分: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
答案 1 :(得分: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]
答案 2 :(得分:0)
以下是其他几种方法:
eval("foo{}()".format(whatfoo))
或
locals()['foo{}'.format(whatfoo)]