Модуль inspect
, уже упоминавшийся в других ответах, особенно удобен, потому что вы легко можете фильтровать имена и значения объектов, которые вас интересуют. inspect.getmembers принимает два аргумента: объект, члены которого вы исследуете, и предикат (функция, возвращающая bool
), который примет (возвратит) True
для) только те объекты, которые вас интересуют.
Чтобы получить «объект, который является этим модулем», вам нужна следующая известная идиома:
import sys
this_module = sys.modules[__name__]
В вашем предикате вы хотите выбрать только объекты, которые являются функциями и имеют имена, начинающиеся с site_
:
import inspect
def function_that_has_site(f):
return inspect.isfunction(f) and f.__name__.startswith('site_')
С этими двумя предметами ваша петля становится:
for n, coolfunc in inspect.getmembers(this_module, function_that_has_site):
result = coolfunc(blabla, yada)
if result: return result
Я также разделил тело цикла так, чтобы каждая функция вызывалась только один раз (что экономит время и - более безопасный подход, избегая возможных побочных эффектов) ... а также переписывая его в Python ; -)