Я пытаюсь построить диспетчер на основе декоратора, например, который вы используете в Flask или Pyramid.Я получил кое-что, что работает, но наткнулся на что-то вроде уловки-22.Следующий код работает, но только потому, что foo () выполняется и устанавливает атрибут .mq_path.При запуске приложения и построении списка диспетчеризуемых функций атрибуты еще не установлены.Я хочу выполнить foo (), управляемую событиями.
Я мог бы "вручную" подготовить список функций и обновлять их по мере добавления функций, но мне нравится, как работает Flask, просто добавив декоратор кфункция, которая обрабатывает URL (или, в данном случае, путь MQ).
list_of_paths = []
path_dispatcher = {}
def handle_mq(path):
def decorator(fn):
def decorated(*args,**kwargs):
decorated.mq_path = path
print "Hello from the handle_mq() decorator, your path is: {0}".format(path)
return fn(*args,**kwargs)
return decorated
return decorator
@handle_mq('/some/path')
def foo():
print "foo!"
foo() # <- this code only works if I first call the decorated function
for k, v in globals().items():
if hasattr(v, 'mq_path'):
list_of_paths.append(v.mq_path)
path_dispatcher[v.mq_path] = v
print list_of_paths
print path_dispatcher
path_dispatcher['/some/path']()
Итак, в основном вопрос в том, как собрать список декорированных функций перед их первым выполнением?
Я на Python 2.7.