
рдФрд░ рдлрд┐рд░ рд╕реЗ, рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЛ рд╢реБрдн рджрд┐рди!
рдЕрдиреБрд╡рд╛рдж рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЖрдкрдХреА рд░реБрдЪрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рднреА рдЖрдкрдХреЛ рдирд┐рд░рд╛рд╢ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕, рдЙрдирдХреЗ рдХрд╛рдо рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдкрд░рд┐рдЪрд┐рдд рдмрдирд╛рдпрд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рднреА рд▓рд┐рдЦрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рднреА рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЬрд╛рдВрдЪрд╛ рдерд╛, рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдирд╣реАрдВ рдерд╛ - рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд╕рдЬрд╛рдП рдЧрдП рддрд░реНрдХред
рдЦреИрд░, рдЗрд╕ рдЧрд▓рддрдлрд╣рдореА рдХреЛ рд╕реБрдзрд╛рд░реЗрдВ!
рдкрд╛рд╕рд┐рдВрдЧ ("рдЕрдЧреНрд░реЗрд╖рдг") рд╕рдЬрд╛рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ
рдХреЛрдИ рдХрд╛рд▓рд╛ рдЬрд╛рджреВ рдирд╣реАрдВ, рд╣рдореЗрдВ рдмрд╕ рдЬрд░реВрд░рдд рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА!
def a_decorator_passing_arguments(function_to_decorate): def a_wrapper_accepting_arguments(arg1, arg2):
* - рдиреЛрдЯ рдЕрдиреБрд╡рд╛рджрдХ: рдкреАрдЯрд░ рд╡реЗрдВрдХрдореИрди - рдШреЛрд╕реНрдЯрдмрд╕реНрдЯрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдирд╛рдо, рдЙрд╕реА рдирд╛рдо рдХреА рдкрдВрде рдлрд┐рд▓реНрдо рдХрд╛ рдирд╛рдпрдХредрдбреНрд░реЗрд╕рд┐рдВрдЧ рддрд░реАрдХреЗ
рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрдереНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдЪреАрдЬ рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ (
рд╕реНрд╡рдпрдВ ) рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рддрд░рд╣ рд╕реЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕
рд╕реНрд╡рдпрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдХреЗ рдмрд┐рдирд╛ред
def method_friendly_decorator(method_to_decorate): def wrapper(self, lie): lie = lie - 3
рдмреЗрд╢рдХ, рдЕрдЧрд░ рд╣рдо рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд┐рдзрд┐ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ, рддреЛ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐
* args рдХреА рд╕реВрдЪреА рдХреЛ unpacks, рдФрд░
** kwargs kwargs рд╢рдмреНрджрдХреЛрд╢ рдХреЛ unpacks:
def a_decorator_passing_arbitrary_arguments(function_to_decorate):
рд╡рд┐рднрд┐рдиреНрди рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдирд╛
рдорд╣рд╛рди, рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдм рдЖрдк рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВ
рдпрд╣ рдЙрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдо рдЗрд╕реЗ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред
рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рддрд╛рдЬрд╝рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ:
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдпреЗ рджреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдп рд╣реИрдВред рдЬрдм рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ
@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
рд▓рд╛рдВрдЧ? рд▓рд╛рдВрдЧред рд╣рдо рдордзреНрдпрд╡рд░реНрддреА рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
def decorated_function(): print " - ." decorated_function = decorator_maker()(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
* - рдиреЛрдЯ рдЕрдиреБрд╡рд╛рджрдХ: рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓реЗрдЦрдХ рдиреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдж рдмрд┐рдЧ рдмреИрдВрдЧ рдереНрдпреЛрд░реА рдХреЗ рдирд╛рдпрдХ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИредрдпрд╣рд╛рдБ рдпрд╣ рд╣реИ, рдорд╛рдВрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдордирдорд╛рдиреЗ рддрд░реНрдХ рджрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдмреЗрд╢рдХ, рдХреЛрдИ рднреА рдЪрд░ рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
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): """ . , . . , , , , . """
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдм рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред
рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕ рдЕрдиреБрднреВрддрд┐ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддреЗ рдереЗ, рддреЛ рдпрд╣ рд╕реБрдирдХрд░ рдХрд┐ рд╡реЗ рдЖрдкрд╕реЗ рдХреИрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ: "рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ред"
рд▓реЗрдХрд┐рди рдЕрдм рдЖрдкрдХреЛ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ ?;;
рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ
- рдкрд╛рдпрдерди 2.4 рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдереЗ, рдЗрд╕рд▓рд┐рдП рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдХреНрдпрд╛ рдЪрд▓реЗрдЧрд╛ред
- рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ рдзреАрдорд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред
- рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ "рдбреАрдХреЛрдб" рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдмреЗрд╢рдХ, рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд▓реЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╕рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдкреВрд░реНрд╡рд╡рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдбреЗрдХреЛрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЕрдВрддрд┐рдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ
рдлрдВрдХреНрд╢рдирд▓рдмреБрд▓рд╡реИрдкреНрд╕ рд╕рд╣рд┐рдд
рдлрдВрдХреНрд╢рдирд▓рдмреВрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдкрд╛рдЗрдерди 2.5 рдореЗрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд▓рдкреЗрдЯреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ (рдЗрд╕рдХрд╛ рдирд╛рдо, рдЬрд┐рд╕рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреНрд╖реЗрддреНрд░, рдЗрд╕рдХрд╛ рдбреЙрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЖрджрд┐) рдЖрд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдПред ред
рдордЬрд╝реЗрджрд╛рд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐
рдлрдВрдХреНрд╢рдирд▓рдмреБрд▓рд╕реНрд╡реИрдкреНрд╕ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИред
рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдореИрдВ рдЙрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдореИрдВ рдЕрдХреНрд╕рд░ рд╕реБрдирддрд╛ рд╣реВрдВ: рд╣рдореЗрдВ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (рдЬрд┐рд╕ рдХреЛрдб рдХреЛ рд╣рдо рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ) рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рд╣рдо рдЙрд╕ рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рддрдХ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ)ред
рдПрдХ рд╣реА рдХреЛрдб рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдмрд┐рдирд╛:
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!")
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рдХреЛрдб рдХреА рдПрдХ рднреА рдкрдВрдХреНрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдмрд┐рдирд╛!
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()
рдЕрдЬрдЧрд░ рдореЗрдВ
рд╕рдВрдкрддреНрддрд┐, рд╕реНрдЯреЗрдЯрдорд┐рдереЛрдб , рдЖрджрд┐ рдЬреИрд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╢рд╛рдорд┐рд▓
рд╣реИрдВ ред
Django рдореЗрдВ, рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╢рд┐рдВрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ, рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдПрдбреНрд░реЗрд╕ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирдХрд▓реА рдореЗрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЗрдирд▓рд╛рдЗрди рдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╡реНрдпрд╛рдкрдХ рдЧреБрдВрдЬрд╛рдЗрд╢ рдЦреЛрд▓рддреЗ рд╣реИрдВ! рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛!
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рд╕рд╛рдордЧреНрд░реА:
рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рдж:
рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИред