
рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рдмрд╛рд░ рд╣реИрдмреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд▓реЗрдЦ (рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдПрдХ рдкреНрд░рд╢реНрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рд╛) рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдПрдХ "рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЧрд╛рдЗрдб" рд╣реИ, рдЬреЛ рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рддреБрд░рдВрдд рдорд╛рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рднреНрдп рд╕реНрддрд░ред
рддреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреНрдпрд╛ рд╣реИ?
рдЖрдЧреЗ рдПрдХ рд▓рдВрдмрд╛ рд▓реЗрдЦ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рдЬрд▓реНрджреА рдореЗрдВ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:
def makebold(fn): def wrapped(): return "<b>" + fn() + "</b>" return wrapped def makeitalic(fn): def wrapped(): return "<i>" + fn() + "</i>" return wrapped @makebold @makeitalic def hello(): return "hello habr" print hello()
рдЖрдк рдореЗрдВ рд╕реЗ рдЬреЛ рд▓реЛрдЧ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд▓рдВрдмреА рдкреЛрд╕реНрдЯ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд╛рдпрдерди рдореЗрдВ рдХрд╛рд░реНрдп рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
def shout(word=""): return word.capitalize()+"!" print shout()
рдЗрд╕ рддрдереНрдп рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдо рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдкрд░ рд▓реМрдЯреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдордЭрдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...!
def talk():
рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдВрдХ
рдЕрдЪреНрдЫрд╛, рдХреНрдпрд╛ рдЖрдк рдЕрднреА рднреА рдпрд╣рд╛рдБ рд╣реИрдВ? :)
рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рд╡рд╕реНрддреБ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ:
- рдПрдХ рдЪрд░ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ;
- рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЦреИрд░, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ!
рдЖрдЗрдП рджреЗрдЦреЗрдВ:
def getTalk(type="shout"):
рд░реБрдХреЛ, рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
def doSomethingBefore(func): print " - , , " print func() doSomethingBefore(scream)
рдЦреИрд░, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬреНрдЮрд╛рди рд╣реИрдВ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рд░реИрдкрд░" рд╣реИ
рдЬреЛ рд╣рдореЗрдВ рд╕рдЬрд╛рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдЙрд╕рдХреЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИредрдЪрд▓реЛ рдЕрдкрдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" рдмрдирд╛рдПрдВ
рд╢рд╛рдпрдж рдЕрдм рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддреЗ рд╣реИрдВ,
a_stand_alone_function рдХреЗ рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди,
a_stand_alone_function _decorated рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдХреБрдЫ рднреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдмрд╕
a_stand_alone_function рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ
рд▓рд┐рдЦреЗрдВ , рдЬреЛ
my_shiny_new_decorator рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реМрдЯрд╛
рд╣реИ :
a_stand_alone_function = my_shiny_new_decorator(a_stand_alone_function) a_stand_alone_function()
рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдареАрдХ рд╡реИрд╕реА рд╣реА рдмрд╛рдд рд╣реИ рдЬреИрд╕реА @ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВред :)
рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд░рд╣рд╕реНрдп рдХреЗ рдкреНрд░рднрд╛рдордВрдбрд▓ рдХреЛ рдирд╖реНрдЯ рдХрд░рдирд╛
рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
@my_shiny_new_decorator def another_stand_alone_function(): print " " another_stand_alone_function() #: # - , # # - ,
рд╣рд╛рдБ, рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реИ!
рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рд░реНрдл рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП
рдХреГрддреНрд░рд┐рдо рдЪреАрдиреА рд╣реИ :
another_stand_alone_function = my_shiny_new_decorator(another_stand_alone_function)
рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕
рдбреЗрдХреЛрд░реЗрдЯрд░ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рд╕рд┐рд░реНрдл рдПрдХ рдкрд╛рдпрдердирд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдкрд╛рдпрдерди рдореЗрдВ рдХреБрдЫ
рдХреНрд▓рд╛рд╕рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ , рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╕рдЬреНрдЬрд╛рдХрд╛рд░, рдпрд╛ рдХрд┐рд╕реА рднреА Paytonist рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗред
рдмреЗрд╢рдХ, рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ рдореЗрдВ рдШреЛрдВрд╕рд▓рд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣:
def bread(func): def wrapper(): print "</------\>" func() print "<\______/>" return wrapper def ingredients(func): def wrapper(): print "##" func() print "~~" return wrapper def sandwich(food="----"): print food sandwich()
рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
@bread @ingredients def sandwich(food="----"): print food sandwich() #: # </------\> # ## # ---- # ~~ # <\______/>
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдЬрд╛рд╡рдЯ рдЖрджреЗрд╢ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:
@ingredients @bread def sandwich(food="----"): print food sandwich() #: # ## # </------\> # ---- # <\______/> # ~~
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдк рдЦреБрд╢реА рд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдПрд╣рд╕рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рд╡реЗ рдХреНрдпрд╛ рдЦрд╛рддреЗ рд╣реИрдВред
рдЬреЛ рд▓реЛрдЧ рдЕрдкрдиреЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдкреАрдбрд╝рд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдХрд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧ рдкрд░ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд╛рдордЧреНрд░реА:
рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рдж:
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛, рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЙрди рд╕рднреА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
UPD: рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрди: рд╕рдЬрд╛рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛, рд╕рдЬрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдЬреНрдЬрд╛рдХрд╛рд░, рдЖрджрд┐ред
UPD2: рд▓реЗрдЦ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред