рд╣рдо рдкрд╛рдпрдерди рдореЗрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ, рдХрджрдо рд╕реЗ рдХрджрдоред рдЪрд░рдг 1


рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рдмрд╛рд░ рд╣реИрдмреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд▓реЗрдЦ (рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдПрдХ рдкреНрд░рд╢реНрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рд╛) рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдПрдХ "рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЧрд╛рдЗрдб" рд╣реИ, рдЬреЛ рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рддреБрд░рдВрдд рдорд╛рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рднреНрдп рд╕реНрддрд░ред

рддреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреНрдпрд╛ рд╣реИ?


рдЖрдЧреЗ рдПрдХ рд▓рдВрдмрд╛ рд▓реЗрдЦ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рдЬрд▓реНрджреА рдореЗрдВ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:
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() ##  <b><i>hello habr</i></b> 


рдЖрдк рдореЗрдВ рд╕реЗ рдЬреЛ рд▓реЛрдЧ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд▓рдВрдмреА рдкреЛрд╕реНрдЯ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд╛рдпрдерди рдореЗрдВ рдХрд╛рд░реНрдп рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ

рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд╛рдпрдерди рдлрд╝рдВрдХреНрд╢рди рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
 def shout(word=""): return word.capitalize()+"!" print shout() # : '!' #    -  ,     , #      scream = shout # ,     :     "shout", #      "scream".  ,    #   "shout"  "scream": print scream() # : '!' #  ,  ,     "shout",     #     "scream" del shout try: print shout() except NameError, e: print e #: "name 'shout' is not defined" print scream() # : '!' 

рдЗрд╕ рддрдереНрдп рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдо рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдкрд░ рд▓реМрдЯреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдордЭрдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...!

 def talk(): #    "talk"    ... def whisper(word=""): return word.lower()+"..."; # ...     ! print whisper() # ,     "talk",      #    "whisper". talk() # : "..." #    "talk"     "whisper": try: print whisper() except NameError, e: print e # : "name 'whisper' is not defined" 

рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдВрдХ

рдЕрдЪреНрдЫрд╛, рдХреНрдпрд╛ рдЖрдк рдЕрднреА рднреА рдпрд╣рд╛рдБ рд╣реИрдВ? :)

рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдп рдкреВрд░реНрдг рд╡рд╕реНрддреБ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ:

рдЦреИрд░, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ!
рдЖрдЗрдП рджреЗрдЦреЗрдВ:
 def getTalk(type="shout"): #      def shout(word=""): return word.capitalize()+"!" def whisper(word="") : return word.lower()+"..."; #    if type == "shout": # ,     "()",     , #     return shout else: return whisper #     ? #        talk = getTalk() #    , "talk"  -  "function": print talk # : <function shout at 0xb7ea817c> #   ,   ,  " ": print talk() #    -       : print getTalk("whisper")() # : ... 

рд░реБрдХреЛ, рдЪреВрдВрдХрд┐ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 def doSomethingBefore(func): print "  - ,     ,    " print func() doSomethingBefore(scream) #: #   - ,     ,     # ! 

рдЦреИрд░, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬреНрдЮрд╛рди рд╣реИрдВ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рд░реИрдкрд░" рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд╕рдЬрд╛рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдФрд░ рдЙрд╕рдХреЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИред

рдЪрд▓реЛ рдЕрдкрдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" рдмрдирд╛рдПрдВ

 #  -  ,       def my_shiny_new_decorator(a_function_to_decorate): #     -"". #   (   ?..)   , #         . def the_wrapper_around_the_original_function(): #   ,       #   print " - ,     " #     a_function_to_decorate() #    ,       #   print "  - ,  " #     "a_function_to_decorate"     # ,  -,     #  ,  ,      . #  ! return the_wrapper_around_the_original_function #  ,     ,      . def a_stand_alone_function(): print "   ,      ?.." a_stand_alone_function() # :    ,      ?.. # ,    ,    ,   #   ,       , #   ,   ,    : a_stand_alone_function_decorated = my_shiny_new_decorator(a_stand_alone_function) a_stand_alone_function_decorated() #: #  - ,      #    ,      ?.. #   - ,   

рд╢рд╛рдпрдж рдЕрдм рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рддреЗ рд╣реИрдВ, 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() #: ---- sandwich = bread(ingredients(sandwich)) sandwich() #: # </------\> # ## # ---- # ~~ # <\______/> 


рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
 @bread @ingredients def sandwich(food="----"): print food sandwich() #: # </------\> # ## # ---- # ~~ # <\______/> 


рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдЬрд╛рд╡рдЯ рдЖрджреЗрд╢ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:
 @ingredients @bread def sandwich(food="----"): print food sandwich() #: # ## # </------\> # ---- # <\______/> # ~~ 


рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдк рдЦреБрд╢реА рд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдПрд╣рд╕рд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рд╡реЗ рдХреНрдпрд╛ рдЦрд╛рддреЗ рд╣реИрдВред
рдЬреЛ рд▓реЛрдЧ рдЕрдкрдиреЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдкреАрдбрд╝рд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдХрд▓ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧ рдкрд░ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рд╛рдордЧреНрд░реА:

рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рдж:
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛, рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЙрди рд╕рднреА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
UPD: рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрди: рд╕рдЬрд╛рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛, рд╕рдЬрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдЬреНрдЬрд╛рдХрд╛рд░, рдЖрджрд┐ред
UPD2: рд▓реЗрдЦ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

Source: https://habr.com/ru/post/In141411/


All Articles