рдердВрдбрд░рдЧреИрд╕: рдЙрдкрдпреЛрдЧ рдХрд╛ рдЕрднреНрдпрд╛рд╕ред рднрд╛рдЧ 1

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦреА рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╡рдЬреНрд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдЬ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



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



OPERATION = {'+': lambda x, y: x+y, '-': lambda x, y: xy, '*': lambda x, y: x*y, '/': lambda x, y: x/y, '^': lambda x, y: pow(x,y)} @Endpoint def calculate(x:Arg(int), y:Arg(int), op:Arg(str, default='+', expander=OPERATION)): return str(op(x,y))
      
      







рд╣рдо рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рджреМрд░рд╛рди рдХрд╛рдлреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдХреБрдЫ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдирд╣реАрдВред рдЦреИрд░, рдЕрдм рдмрд╛рдд рд╣реИред





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



рд╡реИрд╕реЗ, рдЖрдк рдпрд╣рд╛рдВ рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕рднреА рдХреЛрдб рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ ред рдЖрдкрдХреЛ рдлреНрд▓рд╛рд╕реНрдХ-рдЙрджрд╛рд╣рд░рдг рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ





рдЪрд░рдг 0: рдПрдиреЛрдЯреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕, рдпрд╛ рдЬрд╛рджреВ рдкреНрд░рднрд╛рд╡ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ




рдПрдиреЛрдЯреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВред



рдФрд░ рдпрд╣рд╛рдБ рд╣рдо рдХреЗрд╡рд▓ рд╡рд╣реА рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рддрд░реНрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:



 def foo(a: expression, b: expression): ...
      
      







рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо __annotations__



рдлрд╝рдВрдХреНрд╢рди рдХреЗ __annotations__



рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ:



 >>> def foo(a: "bar", b: 5+3): pass >>> foo.__annotations__ {'b': 8, 'a': 'bar'}
      
      







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



рдЪрд░рдг 0.5: рд╕реНрдерд╛рдкрдирд╛




рдореИрдВрдиреЗ рдХреБрдЫ рджреЛрд╕реНрдд рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдЗрд╕ рдЪреАрдЬрд╝ рдХреЛ PyPI рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рдЗрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рд╕реБрдзрд╛рд░: рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдореИрдиреБрдЕрд▓ рдореЗрдВ рд╕реНрдкрд░реНрд╢ рдХрд░реЗрдВрдЧреЗ рд╡реЗ рдХреЗрд╡рд▓ рдЕрд▓реНрдлрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ --pre



: -



 sudo pip install thunderargs --pre
      
      







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



рдЪрд░рдг 1: рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ




рдердВрдбрд░рд╛рд░реНрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рд╣реИред рдлреНрд▓рд╛рд╕реНрдХ рдореЗрдВ рдРрд╕реА рдПрдХ рдЕрдкреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: рдЗрд╕рдХреЗ рдкрд╛рд╕ рдкреВрд░реНрд╡-рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред



рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рд╕рд╛рдзрд╛рд░рдг рдкреЗрдЬрд┐рдиреЗрд╢рди рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдВрдЧреЗ: рдСрдлрд╕реЗрдЯ рдФрд░ рд╕реАрдорд╛ред



рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпреЗ рддрд░реНрдХ рджрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП:



 from random import randrange from thunderargs.flask import Flask app = Flask() # Just a random sequence elements = list(map(lambda x: randrange(1000000), range(100))) @app.route('/step1') def step1(offset: Arg(int), limit: Arg(int)): return str(elements[offset:offset+limit]) if __name__ == '__main__': app.run(debug=True)
      
      







рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдХреНрд▓рд╛рд╕рд┐рдХ рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдмрджрд▓реЗ рд╣реБрдП route



рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг, рдЬрд┐рд╕реЗ рдореИрдВ thunderargs.flask



рд╕реЗ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реВрдВред



рддреЛ, рд╣рдо рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рдЬрд╛рддрд┐ рдкреНрд░рдХрд╛рд░ рд░рдЯрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ, рдФрд░ рдЕрдм рд╣рдореЗрдВ рдЗрди рдЬреИрд╕реЗ рдмреЗрд╡рдХреВрдл рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ:



  offset = int(request.args.get('offset')) limit = int(request.args.get('limit'))
      
      







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



рдЪрд░рдг 2: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди




рдЬрдм рддрдХ рд╣рдорд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИ, рддрдм рддрдХ рд╣рдо рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣рдо рд╕рд┐рд░реНрдл рдЗрд╕рдХреЗ рдкреВрд░рдХ рд╣реЛрдВрдЧреЗред



рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдмрд╣реБрдд рд╣реА рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ:



 @app.route('/step2') def step2(offset: Arg(int, default=0), limit: Arg(int, default=20)): return str(elements[offset:offset+limit])
      
      







рд╣рдо рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗред рд╕рд┐рд╡рд╛рдп, рд╢рд╛рдпрдж, рдПрдХ рддрдереНрдп: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, [0,2,5]



рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ [0,2,5]



ред



рдЪрд░рдг 3: рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ




 @app.route('/step3') def step3(username: Arg(required=True)): return "Hello, {}!".format(username)
      
      







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



рдФрд░ рдпрджрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ thunderargs.errors.ArgumentRequired



рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред



рдЪрд░рдг 4: рдПрдХрд╛рдзрд┐рдХ рддрд░реНрдХ




рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рднреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдПрдХ map object



рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдореЗрдВ рдЖрдПрдЧрд╛, рд╕реВрдЪреА рдирд╣реАрдВред



 @app.route('/step4') def step4(username: Arg(required=True, multiple=True)): return "Hello, {}!".format(" and ".join(", ".join(username).rsplit(', ', 1)))
      
      







рдпрджрд┐ рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднреВрд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ рдРрд╕реЗ рддрд░реНрдХ рд╣рдореЗрдВ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рдЙрджрд╛рд╣рд░рдг:



 ?username=John&username=Adam&username=Lucas
      
      







рдмреЗрд╢рдХ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп рдХреЛ рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕ рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрд░реНрдХ рдХреЛ рд╕рднреА рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред



рдЪрд░рдг 5: рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛




рдЖрдЗрдП рд╣рдо рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреЗрдЬрд┐рдиреЗрдЯрд░ рдХреЗ рд╕рд╛рде рд▓реМрдЯрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдорди рдореЗрдВ рд▓рд╛рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ред



 from thunderargs.validfarm import val_gt, val_lt @app.route('/step5') def step5(offset: Arg(int, default=0, validators=[val_gt(-1), val_lt(len(elements))]), limit: Arg(int, default=20, validators=[val_lt(21)])): return str(elements[offset:offset+limit])
      
      







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



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



 def step5(offset: Arg(int, default=0, validators=[lambda x: x >= 0 and x < len(elements)]), limit: Arg(int, default=20, validators=[val_lt(21)])): ...
      
      







рдпрд╛ рдЗрд╕ рддрд░рд╣ рднреА:



 def less_than_21(x): return x < 21 @app.route('/step5_5') def step5_5(offset: Arg(int, default=0, validators=[lambda x: x >= 0 and x < len(elements)]), limit: Arg(int, default=20, validators=[less_than_21])): ...
      
      







рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рддрдм рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИ рдЬрдм рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рдПрдХ рдмреВрд▓рд┐рдпрди рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ, рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛ред



рдЪрд░рдг 6: рддрд░реНрдХреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ




рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдПрдХ рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕реНрдХреИрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



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



 OPERATION = {'+': lambda x, y: x+y, '-': lambda x, y: xy, '*': lambda x, y: x*y, '^': lambda x, y: pow(x,y)} @app.route('/step6') def step6(x:Arg(int), y:Arg(int), op:Arg(str, default='+', expander=OPERATION)): return str(op(x,y))
      
      







рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, op



рд╣рдореЗрдВ рдЙрд╕ рдХреБрдВрдЬреА рд╕реЗ рдЦреАрдВрдЪрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдорд┐рд▓реА рдереАред



expander



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



рдЖрдЬ рд╣рдо рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдореИрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдореИрдиреБрдЕрд▓ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред



рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ





рдЕрдЬрдЧрд░ 2 рдпрд╛ рдЬреАрд╡рд╛рд╢реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк




рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдРрд╕рд╛ рдХреБрдЫ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛ рджреВрд╕рд░реЗ рдкрд╛рдпрдерди рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПред рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрд╡рд░реВрдкрдг рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░, рд╢рд╛рдпрдж, рдпрд╣ рд╕рдм рд╣реИред рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, thunderargs.endpoint



рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣реИ, рдЬрд┐рд╕реЗ annotate



рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:



 @annotate(username=Arg()) def foo(username): ...
      
      







рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдЫреЛрдЯреЗ рдиреЛрдЯреЛрдВ рдХреА рдХреБрдкреНрдкреА




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



рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдЪрд╛рдирдХ рдПрдХ рджреЗрд╢реА рдлреНрд▓рд╛рд╕реНрдХ рд░реВрдЯрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - app.froute



рдЙрдкрдпреЛрдЧ app.froute



ред рд▓реЗрдХрд┐рди рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдПрдиреЛрдЯреЗрд╢рди рдЯреЛрдХрди рд╡рд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред



рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЕрдиреНрдп рдлреНрд▓рд╛рд╕реНрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЛ рддреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЕрднреНрдпрд╛рд╕ рджрд┐рдЦрд╛рдПрдЧрд╛ред



рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рд╕реЗ рджреЛрдиреЛрдВ рдкрде рдЪрд░ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рднреА рдкреИрд░рд╛рдореАрдЯрд░ рджреЛрдиреЛрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред



рдЧреИрд░-рдлреНрд▓рд╛рд╕реНрдХ рдкрд░ рдЫреЛрдЯреЗ рдиреЛрдЯ




рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЧрдбрд╝рдЧрдбрд╝рд╛рд╣рдЯ рдмрд┐рдирд╛ рдлреНрд▓рд╛рд╕реНрдХ рдХреЗ рднреА рдареАрдХ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдкрд░ thunderargs.Endpoint



рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ thunderargs.Endpoint



рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рджрд░рдЕрд╕рд▓, рд╣рд╛рд░реНрдбрдХреЛрд░ рддрд░реНрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╡рд▓ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИред



рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ Arg



рд╕реЗ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рд╡рдВрд╢рдЬ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрдЯреНрд░рд╛рдЧ, рд╕реНрдЯреНрд░рд┐рдВрдЧрдПрд░рдЧ, рдмреБрд▓рдЧреНрд░ рдФрд░ рдЗрддрдиреЗ рдкрд░ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред



рд╣рдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред




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



рдЖрдк рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡, рдЗрдЪреНрдЫрд╛рдУрдВ рдФрд░ рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рдпрд╣рд╛рдБ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдпрд╛ рдпрд╣рд╛рдБ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ ред



рд╡реИрд╕реЗ, рдореЗрд░реЗ рдмрдбрд╝реЗ рдЕрдлрд╝рд╕реЛрд╕ рдХреЗ рд╕рд╛рде, рдордИ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ рдиреЛрдЯреЛрдВ рдХреЛ рдмреЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрд╡рд╛рдж рдкрд╛рда рд▓рд┐рдЦрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рдХреЛрдИ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ :)



рджреВрд╕рд░рд╛ рднрд╛рдЧ рдереЛрдбрд╝рд╛ рдЧреВрдврд╝ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ, рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред



All Articles