有没有办法自动将函数名称附加到列表中?

时间:2013-05-11 17:24:35

标签: python function append

这个想法是当写一个新函数时,它的变量名会自动附加到一个列表中。

请注意,我意识到我可以使用mylist.append(无论如何),但我特意寻找一种自动追加的方法,而不是手动追加。

所以,如果我们从...开始......

def function1(*args):
    print "string"

def function2(*args):
    print "string 2"

mylist = []

...有没有办法将'function1'和'function2'自动附加到mylist,以便最终像这样......

mylist = [function1, function2]

具体来说,我想列出变量名,而不是字符串(例如“function1”)。

我正在学习Python而只是尝试,所以目前这并没有任何特殊用途,我只是想知道它是否可能。

如果我不清楚,请提前感谢任何建议并快乐回答任何问题。

**

2 个答案:

答案 0 :(得分:1)

只需将函数对象添加到列表中:

mylist = [function1, function2]

或使用.append()

mylist.append(function1)
mylist.append(function2)

Python函数是第一类对象。它们是值,就像类,字符串和整数一样。

如果要为整个模块自动执行此操作,可以使用globals() function快速列出目前为止在模块中定义的所有函数,只需inspect.isfunction() predicate的一些帮助:

import inspect
mylist = [v for v globals().itervalues() if inspect.isfunction(v) and v.__module__ == __name__]

v.__module__ == __name__测试确保我们只列出当前模块中的函数,而不是我们导入的任何函数。

然而,显性仍然比隐含更好。在每个函数下面添加mylist.append(functionname),或使用装饰器:

mylist = []
def listed(func):
    mylist.append(func)
    return func

@listed
def function1():
    pass

@listed
def function2():
    pass

您使用@listed装饰器“标记”的每个功能都会添加到mylist列表中。

答案 1 :(得分:0)

原则上,您可以使用装饰器来做到这一点,这可能有资格作为半自动解决方案:

@gather
def function1():
    print "function 1"

@gather
def function2():
    print "function 2"

这种装饰器的一个实现本质上是一个函数,它将函数作为参数:

function_list = []

def gather(func):
    function_list.append(func)  # or .append(func.__name__)
    return func

在这个简单的版本中它可能根本没用,但是流行的库和框架通常采用这种技术的某种增强版本。例如,请参阅Flask的@app.route装饰器,以指定处理特定HTTP请求的函数。