Automatically call all functions matching a certain pattern in python

前端 未结 4 1667
忘掉有多难
忘掉有多难 2021-01-01 03:25

In python I have many functions likes the ones below. I would like to run all the functions whose name matches setup_* without having to explicitly call them fr

相关标签:
4条回答
  • 2021-01-01 03:47

    You can use locals()

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

    Of course you'll want to make sure that your function names don't appear elsewhere in locals.

    In addition, you could also do something like this because functions are first class objects (note the function names are not strings):

    setupfunctions = [setup_1, setup_2, setup_3, myotherfunciton]
    for f in setupfunctions:
        f()
    
    0 讨论(0)
  • 2021-01-01 03:55

    This does not get function objects directly but must use eval, I am checking solution with vars() to get rid of 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_')]
    

    Ok, here the version with 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_')]
    
    0 讨论(0)
  • 2021-01-01 04:02

    Here is one possible solution:

    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()
    
    0 讨论(0)
  • 2021-01-01 04:07
    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()
    

    yields

    # 1
    # 3
    # 2
    
    0 讨论(0)
提交回复
热议问题