Python Decorators: различия между версиями
Материал из noname.com.ua
Перейти к навигацииПерейти к поискуSirmax (обсуждение | вклад) (Новая: =Декораторы в питоне= Разбор только одного примера, что был сложен для меня.) |
Sirmax (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
Разбор только одного примера, что был сложен для меня. |
Разбор только одного примера, что был сложен для меня. |
||
+ | |||
+ | |||
+ | <PRE> |
||
+ | # coding=utf8 |
||
+ | from webob import Request |
||
+ | from wsgiref import simple_server |
||
+ | </PRE> |
||
+ | webob - работа с HTTP |
||
+ | wsgiref - веб сервер. можно использовать любой другой, и имя им легион. |
||
+ | |||
+ | Декоратор. Сама идея декоратора прекрасна - обернуть вызов ф-и в другую ф-ю и потом переопределить оригинальную. |
||
+ | вот хорошие ссылки: |
||
+ | * http://habrahabr.ru/post/141411/ |
||
+ | * http://habrahabr.ru/post/139866/ |
||
+ | |||
+ | <PRE> |
||
+ | def webob_wrap(func): |
||
+ | def wrapped(environ, start_response): |
||
+ | aaa=100 |
||
+ | req = Request(environ) |
||
+ | app = func(req, environ) |
||
+ | return app(environ, start_response) |
||
+ | return wrapped |
||
+ | |||
+ | from webob.exc import HTTPNotFound |
||
+ | |||
+ | |||
+ | def list_topics_app(environ, start_response): |
||
+ | start_response('200 OK', [('Content-type', 'text/plain')]) |
||
+ | return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()]) |
||
+ | #return "123" |
||
+ | |||
+ | def view_topic_app(environ, start_response): |
||
+ | start_response('200 OK', [('Content-type', 'text/plain')]) |
||
+ | return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()]) |
||
+ | #return "123" |
||
+ | |||
+ | def fff(environ, start_response): |
||
+ | start_response('200 OK', [('Content-type', 'text/plain')]) |
||
+ | return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()]) |
||
+ | |||
+ | |||
+ | @webob_wrap |
||
+ | def forum_app(req, environ): |
||
+ | peek = req.path_info_peek() |
||
+ | if not peek: |
||
+ | return list_topics_app |
||
+ | elif peek == 'new_topic': |
||
+ | return new_topic_app |
||
+ | elif peek.isdigit(): |
||
+ | topic_id = int(req.path_info_pop()) |
||
+ | environ['forum_app.topic_id'] = topic_id |
||
+ | return view_topic_app |
||
+ | else: |
||
+ | return HTTPNotFound() |
||
+ | |||
+ | |||
+ | server = simple_server.WSGIServer( |
||
+ | ('127.0.0.1', 8080), |
||
+ | simple_server.WSGIRequestHandler, |
||
+ | ) |
||
+ | |||
+ | server.set_app(forum_app) |
||
+ | server.serve_forever() |
||
+ | </PRE> |
Версия 10:29, 22 июня 2012
Декораторы в питоне
Разбор только одного примера, что был сложен для меня.
# coding=utf8 from webob import Request from wsgiref import simple_server
webob - работа с HTTP wsgiref - веб сервер. можно использовать любой другой, и имя им легион.
Декоратор. Сама идея декоратора прекрасна - обернуть вызов ф-и в другую ф-ю и потом переопределить оригинальную. вот хорошие ссылки:
def webob_wrap(func): def wrapped(environ, start_response): aaa=100 req = Request(environ) app = func(req, environ) return app(environ, start_response) return wrapped from webob.exc import HTTPNotFound def list_topics_app(environ, start_response): start_response('200 OK', [('Content-type', 'text/plain')]) return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()]) #return "123" def view_topic_app(environ, start_response): start_response('200 OK', [('Content-type', 'text/plain')]) return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()]) #return "123" def fff(environ, start_response): start_response('200 OK', [('Content-type', 'text/plain')]) return "\n".join(["%s=%s" % (k, v) for k, v in environ.items()]) @webob_wrap def forum_app(req, environ): peek = req.path_info_peek() if not peek: return list_topics_app elif peek == 'new_topic': return new_topic_app elif peek.isdigit(): topic_id = int(req.path_info_pop()) environ['forum_app.topic_id'] = topic_id return view_topic_app else: return HTTPNotFound() server = simple_server.WSGIServer( ('127.0.0.1', 8080), simple_server.WSGIRequestHandler, ) server.set_app(forum_app) server.serve_forever()