自动调用匹配特定模式的所有Python函数
在Python中,我有很多函数,像下面这些。我想要运行所有名字以setup_*
开头的函数,而不需要在主程序中一个个地调用它们。函数运行的顺序并不重要。我该如何在Python中做到这一点呢?
def setup_1():
....
def setup_2():
....
def setup_3():
...
...
if __name__ == '__main__':
setup_*()
4 个回答
1
这段话的意思是,它不能直接获取函数对象,而是必须使用eval这个方法。我正在检查一个用vars()来替代eval的解决方案:
def setup_1():
print('setup_1')
def setup_2():
print('setup_2')
def setup_3():
print('setup_3')
if __name__ == '__main__':
[eval(func+'()') for func in dir() if func.startswith('setup_')]
好的,这里是使用vars()的版本:
def setup_1():
print('setup_1')
def setup_2():
print('setup_2')
def setup_3():
print('setup_3')
if __name__ == '__main__':
[vars()[func]() for func in dir() if func.startswith('setup_')]
4
这里有一个可能的解决方案:
import types
def setup_1():
print "setup_1"
def setup_2():
print "setup_2"
def setup_3():
print "setup_3"
if __name__ == '__main__':
for name, member in globals().items(): # NB: not iteritems()
if isinstance(member, types.FunctionType) and name.startswith("setup_"):
member()
9
def setup_1():
print('1')
def setup_2():
print('2')
def setup_3():
print('3')
if __name__ == '__main__':
for func in (val for key,val in vars().items()
if key.startswith('setup_')):
func()
# 1
# 3
# 2
yield是一个在编程中常用的关键词,主要用在生成器(generator)里。简单来说,生成器是一种特殊的函数,它可以在运行时暂停和恢复。使用yield的时候,函数会返回一个值,但不会结束函数的执行,这样下次再调用的时候可以从上次暂停的地方继续执行。
举个例子,想象你在做一个长长的任务,比如读书。你可以在读到一半的时候停下来,记住你停下的地方,等到下次再继续读。这就是yield的作用,它让你可以在需要的时候暂停,而不是一次性完成所有的工作。