在python中自动调用与特定模式匹配的所有函数

时间:2010-07-19 13:13:35

标签: python automation

在python中我有很多功能,如下所示。我想运行名称与setup_*匹配的所有函数,而不必从main显式调用它们。运行函数的顺序并不重要。我怎么能在python中做到这一点?

def setup_1():
    ....

def setup_2():
    ....

def setup_3():
    ...

...

if __name__ == '__main__':
    setup_*()

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

以下是一种可能的解决方案:

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()

答案 2 :(得分:0)

您可以使用locals()

L = locals()
for k in L:
    if hasattr(L[k], '__call__') and k.startswith('setup'):
        L[k]()

当然,您需要确保您的函数名称不会出现在本地人的其他地方。

此外,你也可以这样做,因为函数是第一类对象(注意函数名不是字符串):

setupfunctions = [setup_1, setup_2, setup_3, myotherfunciton]
for f in setupfunctions:
    f()

答案 3 :(得分:0)

这不直接获取函数对象但必须使用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_')]