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


рдФрд░ рдлрд┐рд░ рд╕реЗ, рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЛ рд╢реБрдн рджрд┐рди!
рдЕрдиреБрд╡рд╛рдж рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЖрдкрдХреА рд░реБрдЪрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рднреА рдЖрдкрдХреЛ рдирд┐рд░рд╛рд╢ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред


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


рдкрд╛рд╕рд┐рдВрдЧ ("рдЕрдЧреНрд░реЗрд╖рдг") рд╕рдЬрд╛рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ


рдХреЛрдИ рдХрд╛рд▓рд╛ рдЬрд╛рджреВ рдирд╣реАрдВ, рд╣рдореЗрдВ рдмрд╕ рдЬрд░реВрд░рдд рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА!
def a_decorator_passing_arguments(function_to_decorate): def a_wrapper_accepting_arguments(arg1, arg2): #    print ",   :", arg1, arg2 function_to_decorate(arg1, arg2) return a_wrapper_accepting_arguments # ,    ,   , #    "",         #      @a_decorator_passing_arguments def print_full_name(first_name, last_name): print " ", first_name, last_name print_full_name("", "") # : # ,   :   #     # * 

* - рдиреЛрдЯ рдЕрдиреБрд╡рд╛рджрдХ: рдкреАрдЯрд░ рд╡реЗрдВрдХрдореИрди - рдШреЛрд╕реНрдЯрдмрд╕реНрдЯрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдирд╛рдо, рдЙрд╕реА рдирд╛рдо рдХреА рдкрдВрде рдлрд┐рд▓реНрдо рдХрд╛ рдирд╛рдпрдХред

рдбреНрд░реЗрд╕рд┐рдВрдЧ рддрд░реАрдХреЗ


рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрдереНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдЪреАрдЬ рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ ( рд╕реНрд╡рдпрдВ ) рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рддрд░рд╣ рд╕реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рд╕реНрд╡рдпрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдХреЗ рдмрд┐рдирд╛ред
 def method_friendly_decorator(method_to_decorate): def wrapper(self, lie): lie = lie - 3 # ,  -     :-) return method_to_decorate(self, lie) return wrapper class Lucy(object): def __init__(self): self.age = 32 @method_friendly_decorator def sayYourAge(self, lie): print " %s,     ?" % (self.age + lie) l = Lucy() l.sayYourAge(-3) # :  26,     ? 

рдмреЗрд╢рдХ, рдЕрдЧрд░ рд╣рдо рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд┐рдзрд┐ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ, рддреЛ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ * args рдХреА рд╕реВрдЪреА рдХреЛ unpacks, рдФрд░ ** kwargs kwargs рд╢рдмреНрджрдХреЛрд╢ рдХреЛ unpacks:
 def a_decorator_passing_arbitrary_arguments(function_to_decorate): #  ""    def a_wrapper_accepting_arbitrary_arguments(*args, **kwargs): print "   -?:" print args print kwargs #    *args  **kwargs #        ,    : # http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/ function_to_decorate(*args, **kwargs) return a_wrapper_accepting_arbitrary_arguments @a_decorator_passing_arbitrary_arguments def function_with_no_argument(): print "Python is cool, no argument here." #   ,   :) function_with_no_argument() # : #    -?: # () # {} # Python is cool, no argument here. @a_decorator_passing_arbitrary_arguments def function_with_arguments(a, b, c): print a, b, c function_with_arguments(1,2,3) # : #    -?: # (1, 2, 3) # {} # 1 2 3 @a_decorator_passing_arbitrary_arguments def function_with_named_arguments(a, b, c, platypus=" ?"): print "  %s, %s  %s ? %s" %\ (a, b, c, platypus) function_with_named_arguments("", "", "", platypus="!") # : #    -?: # ('', '', '') # {'platypus': '!'} #   ,    ? ! class Mary(object): def __init__(self): self.age = 31 @a_decorator_passing_arbitrary_arguments def sayYourAge(self, lie=-3): #        print " %s,     ?" % (self.age + lie) m = Mary() m.sayYourAge() # : #    -?: # (<__main__ .Mary object at 0xb7d303ac>,) # {} #  28,     ? 


рд╡рд┐рднрд┐рдиреНрди рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдирд╛


рдорд╣рд╛рди, рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдм рдЖрдк рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВ

рдпрд╣ рдЙрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдо рдЗрд╕реЗ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред
рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рддрд╛рдЬрд╝рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ:
 #  -    def my_decorator(func): print "  " def wrapper(): print " - ,  " func() return wrapper #  ,    ,   "@"-: def lazy_function(): print "zzzzzzzz" decorated_function = my_decorator(lazy_function) # :    #    "  ",     ,   : #  .   @my_decorator def lazy_function(): print "zzzzzzzz" # :    

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдпреЗ рджреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдп рд╣реИрдВред рдЬрдм рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ
 @my_decorator 
- рд╣рдо рд╕рд┐рд░реНрдл рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ " my_decorator " рдирд╛рдордХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╛рдо рд╣рдореЗрдВ рд╕реАрдзреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рддрдХ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ... рдирд╣реАрдВ!
рдЪрд▓реЛ рдХреБрдЫ рдбрд░рд╛рд╡рдирд╛ рд╣реИ :)!
 def decorator_maker(): print "  !     : "+\ "      ." def my_decorator(func): print " - !     :    ." def wrapped(): print (" -    . " "         . " "     .") return func() print "   ." return wrapped print "  ." return my_decorator #    .        new_decorator = decorator_maker() # : #   !     :       . #   . #    def decorated_function(): print " -  ." decorated_function = new_decorator(decorated_function) # : #  - !     :    . #    . #    : decorated_function() # : #  -    .          . #      . #  -  . 

рд▓рд╛рдВрдЧ? рд▓рд╛рдВрдЧред рд╣рдо рдордзреНрдпрд╡рд░реНрддреА рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
 def decorated_function(): print " -  ." decorated_function = decorator_maker()(decorated_function) # : #   !     :       . #   . #  - !     :    . #    . # : decorated_function() # : #  -    .          . #      . #  -  . 

рдФрд░ рдЕрдм рдлрд┐рд░ рд╕реЗ, рдФрд░ рднреА рдЫреЛрдЯрд╛:
 @decorator_maker() def decorated_function(): print "I am the decorated function." # : #   !     :       . #   . #  - !     :    . #    . #  : decorated_function() # : #  -    .          . #      . #  -  . 

рдХреНрдпрд╛ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╣рдордиреЗ "@" рдЪрд┐рдиреНрд╣ рдХреЗ рдмрд╛рдж рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмреБрд▓рд╛рдпрд╛? :)

рдЕрдВрдд рдореЗрдВ, рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рд╡рд╛рдкрд╕реА рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╣рдо рдлреНрд▓рд╛рдИ рдкрд░ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?
 def decorator_maker_with_arguments(decorator_arg1, decorator_arg2): print "  !     :", decorator_arg1, decorator_arg2 def my_decorator(func): print " - .         :", decorator_arg1, decorator_arg2 #       ! def wrapped(function_arg1, function_arg2) : print (" -    .\n" "      : \n" "\t-  : {0} {1}\n" "\t-  : {2} {3}\n" "      " .format(decorator_arg1, decorator_arg2, function_arg1, function_arg2)) return func(function_arg1, function_arg2) return wrapped return my_decorator @decorator_maker_with_arguments("", "") def decorated_function_with_arguments(function_arg1, function_arg2): print (" -         : {0}" " {1}".format(function_arg1, function_arg2)) decorated_function_with_arguments("", "") # : #   !     :   #  - .         :   #  -    . #       : # -  :   # -  :   #        #  -         :   

* - рдиреЛрдЯ рдЕрдиреБрд╡рд╛рджрдХ: рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓реЗрдЦрдХ рдиреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдж рдмрд┐рдЧ рдмреИрдВрдЧ рдереНрдпреЛрд░реА рдХреЗ рдирд╛рдпрдХ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рдорд╛рдВрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдордирдорд╛рдиреЗ рддрд░реНрдХ рджрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдмреЗрд╢рдХ, рдХреЛрдИ рднреА рдЪрд░ рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
 c1 = "" c2 = "" @decorator_maker_with_arguments("", c1) def decorated_function_with_arguments(function_arg1, function_arg2): print (" -         : {0}" " {1}".format(function_arg1, function_arg2)) decorated_function_with_arguments(c2, "") # : #   !     :   #  - .         :   #  -    . #       : # -  :   # -  :   #        #  -         :   

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

рдереЛрдбрд╝реА рдкреНрд░реИрдХреНрдЯрд┐рд╕: рдбреЗрдХреЛрд░реЗрдЯрд░ рдбреЗрдХреЛрд░реЗрдЯрд┐рдВрдЧ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд┐рдЦреЗрдВ


рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЕрднреА рднреА рд░реИрдВрдХреЛрдВ рдореЗрдВ рд╣реИрдВ - рддреЛ рдпрд╣рд╛рдВ рдореЗрд░реА рдУрд░ рд╕реЗ рдПрдХ рдмреЛрдирд╕ рд╣реИред
рдпрд╣ рдЫреЛрдЯрд╛ рд╕рд╛ рдЯреНрд░рд┐рдХ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд╕рд╛рдзрд╛рд░рдг рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛, рдЬреЛ рдмрд╣рд╕ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ, рд╣рдордиреЗ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ред
рд╣рдордиреЗ рдЕрдкрдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд▓рдкреЗрдЯ рд▓рд┐рдпрд╛ред
рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рд╣реИ?
рдмрд┐рд▓реНрдХреБрд▓, рд╕рдЬреНрдЬрд╛рдХрд╛рд░!

рдЪрд▓реЛ рдХреБрдЫ рдордЬрд╝реЗ рдХрд░реЗрдВ рдФрд░ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд┐рдЦреЗрдВ:
 def decorator_with_args(decorator_to_enhance): """        .     ,    .    .        ,       ,    ,  ,    . """ #     ,      : def decorator_maker(*args, **kwargs): #    ,      # ,    ,   "" def decorator_wrapper(func): #   ,     , ,    #   ( ). #    ,        # decorator(func, *args, **kwargs) # ,     return decorator_to_enhance(func, *args, **kwargs) return decorator_wrapper return decorator_maker 

рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 #   ,         :-) #   ,      "decorator(func, *args, **kwargs)" @decorator_with_args def decorated_decorator(func, *args, **kwargs): def wrapper(function_arg1, function_arg2): print "  ...:", args, kwargs return func(function_arg1, function_arg2) return wrapper #       ,   : @decorated_decorator(42, 404, 1024) def decorated_function(function_arg1, function_arg2): print "", function_arg1, function_arg2 decorated_function(" ", " ") # : #   ...: (42, 404, 1024) {} #      # ! 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдм рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред
рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕ рдЕрдиреБрднреВрддрд┐ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддреЗ рдереЗ, рддреЛ рдпрд╣ рд╕реБрдирдХрд░ рдХрд┐ рд╡реЗ рдЖрдкрд╕реЗ рдХреИрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ: "рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ред"
рд▓реЗрдХрд┐рди рдЕрдм рдЖрдкрдХреЛ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ ?;;

рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ



рдЕрдВрддрд┐рдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдлрдВрдХреНрд╢рдирд▓рдмреБрд▓рд╡реИрдкреНрд╕ рд╕рд╣рд┐рдд рдлрдВрдХреНрд╢рдирд▓рдмреВрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдкрд╛рдЗрдерди 2.5 рдореЗрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд▓рдкреЗрдЯреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ (рдЗрд╕рдХрд╛ рдирд╛рдо, рдЬрд┐рд╕рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреНрд╖реЗрддреНрд░, рдЗрд╕рдХрд╛ рдбреЙрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЖрджрд┐) рдЖрд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдПред ред
рдордЬрд╝реЗрджрд╛рд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдлрдВрдХреНрд╢рдирд▓рдмреБрд▓рд╕реНрд╡реИрдкреНрд╕ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИред
 #   ,     __name__ . def foo(): print "foo" print foo.__name__ # : foo # ,     : def bar(func): def wrapper(): print "bar" return func() return wrapper @bar def foo(): print "foo" print foo.__name__ # : wrapper # "functools"      import functools def bar(func): #  "wrapper"  "func" #   : @functools.wraps(func) def wrapper(): print "bar" return func() return wrapper @bar def foo(): print "foo" print foo.__name__ # : foo 

рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?


рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдореИрдВ рдЙрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдореИрдВ рдЕрдХреНрд╕рд░ рд╕реБрдирддрд╛ рд╣реВрдВ: рд╣рдореЗрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (рдЬрд┐рд╕ рдХреЛрдб рдХреЛ рд╣рдо рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ) рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рд╣рдо рдЙрд╕ рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рддрдХ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ)ред
рдПрдХ рд╣реА рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдмрд┐рдирд╛:
 def benchmark(func): """ ,  ,     . """ import time def wrapper(*args, **kwargs): t = time.clock() res = func(*args, **kwargs) print func.__name__, time.clock() - t return res return wrapper def logging(func): """ ,   . (,    ,      !) """ def wrapper(*args, **kwargs): res = func(*args, **kwargs) print func.__name__, args, kwargs return res return wrapper def counter(func): """ ,       . """ def wrapper(*args, **kwargs): wrapper.count += 1 res = func(*args, **kwargs) print "{0}  : {1}x".format(func.__name__, wrapper.count) return res wrapper.count = 0 return wrapper @benchmark @logging @counter def reverse_string(string): return str(reversed(string)) print reverse_string("     ") print reverse_string("A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal: Panama!") # : # reverse_string ('     ',) {} # wrapper 0.0 # reverse_string  : 1x #       # reverse_string ('A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal: Panama!',) {} # wrapper 0.0 # reverse_string  : 2x # !amanaP :lanac a ,noep a ,stah eros ,raj a ,hsac ,oloR a ,tur a ,mapS ,snip ,eperc a ,)lemac a ro( niaga gab ananab a ,gat a ,nat a ,gab ananab a ,gag a ,inoracam ,elacrep ,epins ,spam ,arutaroloc a ,shajar ,soreh ,atsap ,eonac a ,nalp a ,nam A 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рдХреЛрдб рдХреА рдПрдХ рднреА рдкрдВрдХреНрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдмрд┐рдирд╛!
 import httplib @benchmark @logging @counter def get_random_futurama_quote(): conn = httplib.HTTPConnection("slashdot.org:80") conn.request("HEAD", "/index.html") for key, value in conn.getresponse().getheaders(): if key.startswith("xb") or key.startswith("xf"): return value return ", ...  !" print get_random_futurama_quote() print get_random_futurama_quote() #outputs: #get_random_futurama_quote () {} #wrapper 0.02 #get_random_futurama_quote  : 1x #The laws of science be a harsh mistress. #get_random_futurama_quote () {} #wrapper 0.01 #get_random_futurama_quote  : 2x #Curse you, merciful Poseidon! 

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

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

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

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


All Articles