自动调用匹配特定模式的所有Python函数

6 投票
4 回答
2448 浏览
提问于 2025-04-16 01:30

在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的作用,它让你可以在需要的时候暂停,而不是一次性完成所有的工作。

撰写回答