Автоматически вызывать все функции, соответствующие определенному шаблону в Python - PullRequest
4 голосов
/ 19 июля 2010

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

def setup_1():
    ....

def setup_2():
    ....

def setup_3():
    ...

...

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

Ответы [ 4 ]

7 голосов
/ 19 июля 2010
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
2 голосов
/ 19 июля 2010

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

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 голосов
/ 19 июля 2010

Это не позволяет получить объекты-функции напрямую, но должно использовать 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 голосов
/ 19 июля 2010

Вы можете использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...