Питон: Декоратор Диспетчер: Уловка-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']()