2013-05-11 43 views
0

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

只是要注意,我知道我可以使用mylist.append(无论),但我特别寻找一种方法来自动追加,而不是手动。

因此,如果我们开始与...

def function1(*args): 
    print "string" 

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

mylist = [] 

...是有办法追加“功能1”和“函数2”自动MYLIST这样它最终会这样的..

mylist = [function1, function2] 

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

我在学习Python,只是在试验,所以这个目前没有任何特定的用途,我只是想知道它是否可能。

如果我不清楚,请提前感谢您的任何建议和快乐的回答。

**

回答

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

+0

嗨马丁,谢谢你的回应。我知道可以做到这一点,但我特别想知道是否可以自动做到这一点。我的想法是,如果我要编写许多函数,那么我就不必费心将每个函数添加到列表中。 – user2061277 2013-05-11 17:30:01

+0

@ user2061277显式优于隐式。它甚至会如何决定将什么放入这个列表,哪些不是? – delnan 2013-05-11 17:32:23

+0

@ user2061277:从您的问题中不清楚。有很多选择;使用装饰器('标记'你想添加到列表中的所有函数,只需要一些额外的语法),列出'globals()'命名空间中的所有对象,然后过滤函数等。 – 2013-05-11 17:32:45

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请求的函数。

相关问题