рдереЛрдбрд╝рд╛ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЬреЛрдбрд╝реЗрдВ: рд╕рдЬреНрдЬрд╛рдХрд╛рд░

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

рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдЫреЛрдЯрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд┐рдпрдо рд╣реИрдВред рдирд┐рд░реНрдорд┐рдд рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдпрд╣реА рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, @staticmethod , @classmethod рдФрд░ рдЬреИрд╕реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ (рдпрджрд┐ рдХреЛрдИ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛)ред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╕рдЬрд╛рд╡рдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИрдВред рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдХреЗ, рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдЬрд╛рдпрд╛ рд╣реБрдЖ рд╕реНрд░реЛрдд рдбреЗрдХреЛрд░реЗрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдЕрдкрдиреА рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝рдВрдХреНрд╢рди рдХреЗ "__annotations__" рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦрддрд╛ рд╣реИред

рдпрджрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рд╡рд┐рдзрд┐) рдХреЛ рдХрдИ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╕рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдФрд░ рд╕рднреА рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╣реИ рдХрд┐, рдлрд╛рд░реНрдо рдХрд╛ рдПрдХ рдбрд┐рдЬрд╛рдЗрди:

 @decorator_one @decorator_two @decorator_three def some_function(): pass 


рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

"рд░реЗрдЧ" рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд╣рд╛ рдерд╛) рдкрд╛рдпрдерди 2.x рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 3.x рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ (рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рджреЛрдиреЛрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдВрдЧрддрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИ рдереА)ред

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

рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдБ рд╣реИ ред

рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ PyPI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 $ pip install regd 


рдиреАрдЪреЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рджрд┐рдП рдЧрдП рд╣реИрдВред

1. рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдкрдВрдЬреАрдХрд░рдгред

рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдзрд╛рд░рдг рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:

 from regd import DecoratorRegistry as dreg #  ""  simple_decorator = dreg.decorator( mydecorator) #  ""  param_decorator = dreg.parametrized_decorator( param_decorator) 


2. рдкреНрд░рддрд┐рдмрд┐рдВрдм рдПрдкреАрдЖрдИ

API рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдкрд╣рд▓реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рдПрдВ рдФрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ рдореМрдЬреВрдж рд╣реИред

 from regd import DecoratorRegistry as dreg #   def mydecorator( fn) : #    -  ... def wrapper( *args, **kwargs) # ...   -  ... return fn( *args, **kwargs) return wrapper #    mydecorator = dreg.decorator( mydecorator) 


рдпрд╛рдж рд░рдЦреЗрдВ - рдЖрдкрдХреЛ рд╕рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

рдЕрдм, рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж, рд╣рдо рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЕрдкрдиреЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 @mydecorator def myfunc() : pass 


рдЕрдм, рдХрд┐рд╕реА рднреА рд╕рдордп, рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рднреА, рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ:
 print( dreg.is_decorated_with( myfunc, mydecorator)) 


рдХреБрдЫ рдФрд░ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЗ:



рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдХрд╛рдо рдЖрддрд╛ рд╣реИ рдпрд╛ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИред рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

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


All Articles