рдореБрдЭреЗ рд▓реЗрдЦ рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рдереА
рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдмрд╡рдВрдбрд░ рдпрд╛ рдкреИрдЪ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рдХреА рд╕рдмрд╕реЗ рдЫреЛрдЯреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ , рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗред
рдлрд┐рд░ рднреА, рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХрд╛ рд╕рдВрд╢реЛрдзрди рдмрд╣реБрдд рдЦрддрд░рдирд╛рдХ рдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рдВрдЪрд╛рд▓рди рд╣реИред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрд╛рдпрдерди рджреБрднрд╛рд╖рд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
рдЖрдЗрдП рдЗрд╕ рдХрдореА рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рдорд╛рди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореИрдВ рдЕрднреА рд▓рд┐рд╕реНрдк рдпрд╛ рдПрд░реНрд▓рд╛рдВрдЧ рдореЗрдВ рдорд┐рд▓рд╛ рдерд╛)ред рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдореВрд░реНрдд рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реА (рдПрдПрд╕рдЯреА) рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рд╕рдВрд╢реЛрдзрди рд╣реИред
рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП - рдПрдПрд╕рдЯреА рдХреНрдпрд╛ рд╣реИ? рдПрдПрд╕рдЯреА рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХрд╛ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ, рдЬреЛ рдкрд╛рд░реНрд╕рд░ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЛрдб
def func(who): print "Hello, %s!" % who func()
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдПрд╕рдЯреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
FunctionDef( name='func',
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдкреЗрдбрд╝ рдХреЗ рдХрд┐рд╕реА рднреА рддрддреНрд╡ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрддреНрд╡реЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдкреВрд░реНрдг рдкреНрд░рд▓реЗрдЦрди (рдорд╛рдирдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ)ред
рддреЛ, рд╡рд╛рдкрд╕ рдмрд╡рдВрдбрд░ рдХреЗ рд▓рд┐рдПред рдЖрдЗрдП рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ рдЙрд╕реА рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рддреНред
@shortgen
рдирд╛рдордХ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдФрд░ рдПрдХ рдмрд╛рдЗрдирд░реА рд╢рд┐рдлреНрдЯ рдСрдкрд░реЗрдЯрд░
<<
ред
рд╣рдо рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ рдЙрд╕реА рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЯреНрд░реЗрдирд┐рдВрдЧ
рдмрд╡рдВрдбрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
mkdir tornado-shortgen cd tornado-shortgen/ virtualenv .env source .env/bin/activate pip install tornado
рдЪрд▓реЛ рдмрд╡рдВрдбрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ - рдЖрд╡реЗрджрди
import tornado.ioloop import tornado.web import tornado.gen import os class Handler(web.RequestHandler): @asynchronous @gen.engine @shortgen def get_short(self): (result, status) << self.db.posts.find_e({'name': 'post'}) @asynchronous @gen.engine def get(self): (result, status) = yield gen.Task(self.db.posts.find_e, {'name': 'post'}) application = tornado.web.Application([ (r"/", Handler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
Shortgen_test.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ
рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдПрдПрд╕рдЯреА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
$ python >>> import ast >>> print ast.dump(ast.parse(open("shortgen_test.py").read()))
рд╣рдореЗрдВ рдкрд╛рда рдХрд╛ рдПрдХ рд▓рдВрдмрд╛ рдлрд╝реБрдЯрдкрд╛рде рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рдХреЗрд╡рд▓
get_short
рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдп
get
рдХрд░рддреЗ рд╣реИрдВ
get_short
- рдмрд╛рдЗрдирд░реА рд╢рд┐рдлреНрдЯ рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕реНрд░реЛрдд рдлрд╝рдВрдХреНрд╢рди
FunctionDef( name='get_short', args=arguments(args=[Name(id='self', ctx=Param())], vararg=None, kwarg=None, defaults=[]), body=[ Expr(value=BinOp(
рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
FunctionDef( name='get', args=arguments(args=[Name(id='self', ctx=Param())], vararg=None, kwarg=None, defaults=[]), body=[ Assign(
рдпрд╣ рд░рд╛рдХреНрд╖рд╕реА рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рддрдирд╛ рд▓рдЪреАрд▓рд╛! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред
рдЖрдЗрдП рдорддрднреЗрджреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:
- рдкреВрд░реА рддрд░рд╣ рд╕реЗ
Expr
рдЪрд▓рд╛ рдЧрдпрд╛ BinOp(left, op, right)
рдмрдЬрд╛рдп рдЕрдм Assign(targets, value)
Load
рд╕реЗ Store
рд░рд╛рдЗрдЯ рдСрдкрд░реЗрдВрдб ctx
рд╡реИрд▓реНрдпреВ рдмрджрд▓ рдЧрдпрд╛- рдХреЙрд▓
self.db.posts.find_e(...)
gen.Task(self.db.posts.find_e, ...)
self.db.posts.find_e(...)
рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред - рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
- рдорд┐рд╕рд┐рдВрдЧ рдбреЗрдХреЛрд░реЗрдЯрд░
@shortgen
рддрджрдиреБрд╕рд╛рд░, рдкрд╣рд▓реЗ рджреВрд╕рд░реЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ
- рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЦреЛрдЬреЗрдВ,
@shortgen
decorator_list
рдореЗрдВ @shortgen
decorator_list
рд╣реИ - рдЗрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╣рдЯрд╛рдПрдВ
- рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдореЗрдВ рдмрд╛рдЗрдирд░реА рд╢рд┐рдлреНрдЯ рдСрдкрд░реЗрдЯрд░
BinOp
рдкрддрд╛ рд▓рдЧрд╛рдПрдВ - рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдСрдкрд░реЗрдВрдб рдХреЛ рд╕рд╣реЗрдЬреЗрдВред рдмрд╛рдИрдВ рдУрд░,
Store
рдкрд░ Load
рд╕рд╛рде ctx
рдХреЛ рдмрджрд▓реЗрдВ, рд╕рд╣реА рдСрдкрд░реЗрдВрдб рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдФрд░ рдЙрд╕рдХреЗ рддрд░реНрдХ (рд╕реНрдерд┐рддрд┐, kw, рдФрд░ "рд╕реНрдЯрд╛рд░" - *, **) рдирд┐рдХрд╛рд▓реЗрдВред - рдкрд╣рд▓реЗ рд╕реНрдерд┐рддреАрдп рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди (
self.db.posts.find_e
) рдХрд╛ рдирд╛рдо рдЬреЛрдбрд╝реЗрдВ ( self.db.posts.find_e
, рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдореЗрдВ рд╕реНрдерд┐рддрд┐ рд╕рдВрдмрдВрдзреА рддрд░реНрдХ [self.db.posts.find_e, {'name': 'post'}]
, рдФрд░ рдмрд╛рдХреА рд╕рднреА рдЦрд╛рд▓реА рд╣реИрдВред - рдЗрди рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛
Call
рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА gen.Task
рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдБ - рдЗрд╕реЗ рдЙрдкрдЬ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ
Assign(targets, value)
рдмрдирд╛рдПрдВ рдФрд░ рд▓рдХреНрд╖реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ рдмрд╛рдИрдВ рдУрд░ рд╕реНрдерд┐рдд рдСрдкрд░реЗрдВрдб BinOp
рдФрд░ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ - рдмрд╕ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ Yield
- рд╣рдорд╛рд░реЗ рддрд╛рдЬрд╛
Expr
Assign
рд╕рд╛рде Expr
рд╕реНрд░реЛрдд рдХреЗ рдкреЗрдбрд╝ рдореЗрдВ рдмрджрд▓реЗрдВ
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдореЗрдВ рдпрд╣ 50 рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд▓реЗ рдЧрдпрд╛ред рдЕрдЧрд░ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ - рд╡рд╣реАрдВ рджреЗрдЦреЗрдВред
рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП? рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реВрдк рдпрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдорд╛рдереЗ рдореЗрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди рдФрд░ рдЗрд╕рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
ast.NodeTransformerрдпрд╣ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░
visit_[NodeType]
рдЬреИрд╕реЗ рддрд░реАрдХреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ
visit_FunctionDef
рдпрд╛
visit_Expr
ред рдорд╛рди рдЬреЛ рджреЗрддрд╛ рд╣реИ рд╡рд╣ рд╡рд┐рдзрд┐ AST рддрддреНрд╡ рдХрд╛ рдирдпрд╛ рдорд╛рди рдмрди рдЬрд╛рдПрдЧрд╛ред рдФрд░ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдЦреБрдж рд╣реА рдкреЗрдбрд╝ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкреЗрдбрд╝ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рддрддреНрд╡ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред
- рд╣рдо рд╕рдЬрд╛рдпрд╛ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП
visit_FunctionDef
рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ, рд╣рдо self.decorated
рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реИрдВ, рдпрджрд┐ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реИрдВ, рддреЛ рд╣рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдорд╛рд░реНрдХ рдХреЛ self.decorated
- рд╣рдо рдмрд╛рдЗрдирд░реА рд╢рд┐рдлреНрдЯ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
visit_Expression
рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ self.decorated
рдзреНрд╡рдЬ рдХреЛ self.decorated
рдФрд░ Expr
рдмрд┐рд▓реНрдХреБрд▓ рдмрд╛рдЗрдирд░реА рд╢рд┐рдлреНрдЯ рд╣реИред рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрд╛рдХреА рдЬреЛрдбрд╝рддреЛрдбрд╝ ( Expr
рдХреЛ Expr
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛) рдХрд░рддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рд╕ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рд╕рд╛рд░рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдПрд╕рдЯреА рдХреЛ рдпрд╛ рддреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
with open(filepath) as src: orig_ast = ast.parse(src.read()) new_ast = RewriteGenTask().visit(orig_ast) code = compile(new_ast, filename, 'exec') exec code
рдпрд╛ .pyo рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ
stackoverflow.com/questions/8627835/generate-pyc-from-python-astgist.github.com/3849217#L172рдФрд░ рдлрд┐рд░
python my_module.pyo
рдЖрдпрд╛рдд рдХрд░реЗрдВ, рдпрд╛ рдХреЙрд▓ рдХрд░реЗрдВ
рдирд┐рд╖реНрдХрд░реНрд╖
рдПрдПрд╕рдЯреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдкреЛрд░реНрдЯреЗрдмрд▓ рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рд▓рд┐рдЦрдирд╛ рдмрд╛рдИрдЯреЗрдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рд╕реНрдк рдпрд╛ рдПрд░реНрд▓реИрдВрдЧред
рджреВрд╕рд░рд╛ рдкреНрд▓рд╕ - рдХреБрдЫ рднреА рдкреИрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдкрд░рд┐рд╡рд░реНрддрди рд╣рдорд╛рд░реЗ рдФрд░ рдмрд╛рд╣рд░реА рдХреЛрдб рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╢реЗрд╖ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рдХрд╛
рд╡рд░реНрдгрди рдореВрд▓ рд▓реЗрдЦ рдкрд░ рдореЗрд░реА
рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЦреНрдп рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдордХреНрдЦреА рдкрд░ рдПрдПрд╕рдЯреА рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдЗрд╕реЗ рдПрдХ .pyc рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред (рдареАрдХ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рдРрд╕реА рдЫреЛрдЯреА-рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЬрд┐рдирдореЗрдВ рдпрд╣ рдкреИрджрд╛рд╡рд╛рд░ рдПрдХ-рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдРрд╕реА рдЪреАрдиреА рдХрд╛ рдмрд╣реБрдд рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдХрд▓рди рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдЪрд░рдг рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдмрдбрд╝реЗ рдмрд╡рдВрдбрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░, рдЖрдк рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрджрд░реНрдн
рд╕рднреА Gist рдХреЛрдбрдПрдПрд╕рдЯреА рдкреНрд░рд▓реЗрдЦрдиTornado.gen рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрдирдПрдПрд╕рдЯреА рд╕реЗ .pyc рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛рдпрджрд┐ рдпрд╣ рд╕рдм рдбрд░рд╛рд╡рдирд╛ рдмреИрд╕рд╛рдЦреА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рддреЛ xD рд╣реИрдШрд░ рдХрд╛ рдкрд╛рда