这个想法是当写一个新函数时,它的变量名会自动附加到一个列表中。
请注意,我意识到我可以使用mylist.append(无论如何),但我特意寻找一种自动追加的方法,而不是手动追加。
所以,如果我们从...开始......
def function1(*args):
print "string"
def function2(*args):
print "string 2"
mylist = []
...有没有办法将'function1'和'function2'自动附加到mylist,以便最终像这样......
mylist = [function1, function2]
具体来说,我想列出变量名,而不是字符串(例如“function1”)。
我正在学习Python而只是尝试,所以目前这并没有任何特殊用途,我只是想知道它是否可能。
如果我不清楚,请提前感谢任何建议并快乐回答任何问题。
**
答案 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请求的函数。