Питон: Декоратор Диспетчер: Уловка-22

Я пытаюсь построить диспетчер на основе декоратора, например, который вы используете в 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.

1 ответ

Решение

Я нашел ответ!

list_of_paths = []
path_dispatcher = {}

def handle_mq(path):
    def decorator(fn):
        list_of_paths.append(path)
        path_dispatcher[path] = fn
        def decorated(*args,**kwargs):
            print "Hello from handl_mq decorator, your path is: {0}".format(path)
            return fn(*args,**kwargs)
        return decorated
    return decorator

@handle_mq('/some/path')
def foo():
    print "foo!"

print list_of_paths
print path_dispatcher
path_dispatcher['/some/path']()
Другие вопросы по тегам