В Python у меня есть много функций, любит тех ниже. Я хотел бы выполнить все функции, имя которых соответствует setup_*
не имея необходимость явно называть их от основного. Порядок, в котором выполняются функции, не важен. Как я могу сделать это в Python?
def setup_1():
....
def setup_2():
....
def setup_3():
...
...
if __name__ == '__main__':
setup_*()
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
Вот одно из возможных решений:
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()
Вы можете использовать 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()
Это не получает объекты функций напрямую, но должно использовать 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_')]