Автоматически вызовите все функции, соответствующие определенному шаблону в Python

В Python у меня есть много функций, любит тех ниже. Я хотел бы выполнить все функции, имя которых соответствует setup_* не имея необходимость явно называть их от основного. Порядок, в котором выполняются функции, не важен. Как я могу сделать это в Python?

def setup_1():
    ....

def setup_2():
    ....

def setup_3():
    ...

...

if __name__ == '__main__':
    setup_*()
5
задан Felix Kling 19 July 2010 в 13:15
поделиться

4 ответа

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
8
ответ дан 13 December 2019 в 19:20
поделиться

Вот одно из возможных решений:

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()
3
ответ дан 13 December 2019 в 19:20
поделиться

Вы можете использовать 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()
0
ответ дан 13 December 2019 в 19:20
поделиться

Это не получает объекты функций напрямую, но должно использовать 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_')]
0
ответ дан 13 December 2019 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: