Питон: Декоратор Диспетчер: Уловка-22 - PullRequest
0 голосов
/ 04 июня 2018

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

0 голосов
/ 04 июня 2018

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

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']()
...