рдкрд╛рдпрдерди рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЕрдм рдкреИрдЯрд░реНрди-рд╡рд┐рд░реЛрдзреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ

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

рдЕрдкрд╡рд╛рдж рдореБрджреНрджреЗ


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

рдЕрдкрд╡рд╛рдж рд╕реНрдкреЙрдЯ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ


рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВ: "рд╕реНрдкрд╖реНрдЯ" рдЙрд╕ рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ; "рд╣рд┐рдбрди" рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ, рдХрдХреНрд╖рд╛рдУрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ "рдЫрд┐рдкреЗ рд╣реБрдП" рдЕрдкрд╡рд╛рдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рд╢реБрджреНрдз рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ:

 def divide(first: float, second: float) -> float: return first / second 

рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреВрд╕рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ float рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 result = divide(1, 0) print('x / y = ', result) 

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЧреМрд░ рдХрд┐рдпрд╛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрднреА рднреА print рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ 1 рдХреЛ 0 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдПрдХ рдЕрд╕рдВрднрд╡ рдСрдкрд░реЗрд╢рди рд╣реИ, рдпрд╣ рдПрдХ ZeroDivisionError ред рд╣рд╛рдВ, рдРрд╕рд╛ рдХреЛрдб рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рдФрд░ рдкрдардиреАрдп рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдиреБрднрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкрд╛рдпрдерди рдореЗрдВ рдХреБрдЫ рднреА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рд╡рд┐рднрд╛рдЬрди, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, int , str , рдЬрдирд░реЗрдЯрд░, рд▓реВрдк рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдпрд╛ рдХреБрдВрдЬрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪред рдпрд╣рд╛рдВ рддрдХ raise something() рджреБрд░реНрдШрдЯрдирд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЕрдм рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЬрдЧрд╣ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ


рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрд╡рд╛рдж рд╣реИрдВред рдЪрд▓реЛ рдмрд╕ ZeroDivisionError рдФрд░ рдХреЛрдб рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

 def divide(first: float, second: float) -> float: try: return first / second except ZeroDivisionError: return 0.0 

рдЕрдм рд╕рдм рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо 0 рдХреНрдпреЛрдВ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ? 1 рдпрд╛ None рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдмреЗрд╢рдХ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ None рдкреНрд░рд╛рдкреНрдд None рд▓рдЧрднрдЧ рдЙрддрдирд╛ рд╣реА рдмреБрд░рд╛ (рдпрджрд┐ рдмрджрддрд░ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

рджреБрдЦрдж рдирд┐рд╖реНрдХрд░реНрд╖: рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджрд░реНрдн рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

ZeroDivisionError рдПрдХ рдмрд╛рд░ рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЪрд╛рдВрджреА рдХреА рдЧреЛрд▓реА рдирд╣реАрдВ рд╣реИред рдФрд░ рд╣рдо рдмрд╛рд░-рдмрд╛рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ I / O рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

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

рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ


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

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЕрдкрд╡рд╛рдж рдХрд╣рд╛рдБ рдкрдХрдбрд╝рд╛ рд╣реИред рд╡реИрд╕реЗ, рдпрд╣ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдХреНрдпрд╛ рдХреЛрдб рдореЗрдВ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рдЬрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ ред

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

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдЖрд╡реЗрджрди рдореЗрдВ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рдзрд╛рдЧреЗ рд╣реИрдВ: рдПрдХ рдирд┐рдпрдорд┐рдд рдзрд╛рдЧрд╛ рдЬреЛ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдзрд╛рдЧрд╛ рдЬреЛ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ, рдЪрд▓рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдкрдврд╝реЗрдВ рдФрд░ рд╕рдордЭреЗрдВ?

рдХреЗрд╡рд▓ рдбрд┐рдмрдЧрд░ "рдХреИрдЪ рдСрд▓ рдЕрдкрд╡рд╛рдж" рдореЛрдб рдореЗрдВ рдЪрд╛рд▓реВ рд╣реБрдЖред


рдЕрдкрд╡рд╛рдж, рдХреБрдЦреНрдпрд╛рдд goto рддрд░рд╣, рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдлрд╛рдбрд╝ рджреЗрддреЗ рд╣реИрдВред

рдЕрдкрд╡рд╛рдж рдЕрдирдиреНрдп рдирд╣реАрдВ рд╣реИрдВ


рдЖрдЗрдП рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ: рд╕рд╛рдорд╛рдиреНрдп рджреВрд░рд╕реНрде HTTP API рдПрдХреНрд╕реЗрд╕ рдХреЛрдб:

 import requests def fetch_user_profile(user_id: int) -> 'UserProfile': """Fetches UserProfile dict from foreign API.""" response = requests.get('/api/users/{0}'.format(user_id)) response.raise_for_status() return response.json() 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдм рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЖрдВрд╢рд┐рдХ рд╕реВрдЪреА рджреА рдЧрдИ рд╣реИ:

  • рдиреЗрдЯрд╡рд░реНрдХ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рд╕рд░реНрд╡рд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рд╕рд░реНрд╡рд░ рдмрд╣реБрдд рд╡реНрдпрд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реЛрдЧрд╛ред
  • рд╕рд░реНрд╡рд░ рдХреЛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
  • API рдореЗрдВ рдРрд╕рд╛ URL рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдПрдХ рдЧреИрд░-рдореМрдЬреВрдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдкрд░реНрдпрд╛рдкреНрдд рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред
  • рдЖрдкрдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЖрдВрддрд░рд┐рдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рд╕рд░реНрд╡рд░ рдХреНрд░реИрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
  • рд╕рд░реНрд╡рд░ рдЕрдорд╛рдиреНрдп рдпрд╛ рдХреНрд╖рддрд┐рдЧреНрд░рд╕реНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рд╕рд░реНрд╡рд░ рдЕрдорд╛рдиреНрдп JSON рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдЦреБрдж рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ?


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

  • except Exception: pass рд╣рд░ рдЬрдЧрд╣ рд▓рд┐рдЦреЗрдВ except Exception: pass ред рдореГрдд рдЕрдВрддред рдРрд╕рд╛ рди рдХрд░реЗрдВред
  • None рд▓реМрдЯрд╛ред рдмрд╣реБрдд рджреБрд╖реНрдЯред рдирддреАрдЬрддрди, рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд▓рдЧрднрдЧ рд╣рд░ рдкрдВрдХреНрддрд┐ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ if something is not None: рдФрд░ рд╕рднреА рддрд░реНрдХ рд╕рдлрд╛рдИ рдЪреЗрдХ рдХреЗ рдХрдЪрд░реЗ рдХреЗ рдкреАрдЫреЗ рдЦреЛ рдЬрд╛рдПрдВрдЧреЗ, рдпрд╛ рдЖрдк рд╣рд░ рд╕рдордп TypeError рд╕реЗ рдкреАрдбрд╝рд┐рдд рд╣реЛрдВрдЧреЗред рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред
  • рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рд▓рд┐рдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, UserNotFound рдФрд░ MissingUser рдЬреИрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдзрд╛рд░ рд╡рд░реНрдЧ User ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ Django рдореЗрдВ рдмреЗрдирд╛рдореАрд╕рд┐рдпрд░, рд▓реЗрдХрд┐рди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рд▓реЗрдЧрд╛ рдФрд░ рдбреЛрдореЗрди рдореЙрдбрд▓ рдЕрдХрд▓реНрдкрдиреАрдп рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
  • рдПрдХ рдЖрд╡рд░рдг рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рдЪрд░ рдпрд╛ рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдХрдВрдЯреЗрдирд░ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдордиреЗ @dry-python/return рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ред рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреБрдЫ рд╕рд╛рд░реНрдердХ, рдЯрд╛рдЗрдк рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред

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

 from returns.result import Result, Success, Failure def divide(first: float, second: float) -> Result[float, ZeroDivisionError]: try: return Success(first / second) except ZeroDivisionError as exc: return Failure(exc) 

рд╣рдо рджреЛ рдЖрд╡рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ: Success рдпрд╛ Failure ред рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЛ Result рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдкреИрдХ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Result[float, ZeroDivisionError] рд░рд┐рдЯрд░реНрди рдпрд╛ рддреЛ Success[float] рдпрд╛ Failure[ZeroDivisionError] ред

рдпрд╣ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ? рдЕрдзрд┐рдХ рдЕрдкрд╡рд╛рдж рдЕрд╕рд╛рдзрд╛рд░рдг рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Failure рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рд▓рдкреЗрдЯрдиреЗ рд╕реЗ рдПрдХ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ: рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ред

 1 + divide(1, 0) # => mypy error: Unsupported operand types for + ("int" and "Result[float, ZeroDivisionError]") 

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╣реИ рдФрд░ PEP561 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ ред рдпрджрд┐ рдЖрдк рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдкреА рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдЧрд╛ред

 from returns.result import Result, Success, Failure def divide(first: float, second: float) -> Result[float, ZeroDivisionError]: try: return Success('Done') # => error: incompatible type "str"; expected "float" except ZeroDivisionError as exc: return Failure(0) # => error: incompatible type "int"; expected "ZeroDivisionError" 

рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ?


рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ :

  • рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдиреЛрдВ рдХреЛ рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП map ;
  • рдЕрдиреНрдп рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП bind ред

 Success(4).bind(lambda number: Success(number / 2)) # => Success(2) Success(4).map(lambda number: number + 1) # => Success(5) 

рд╕реБрдВрджрд░рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдЖрдкрдХреЛ рдЕрд╕рдлрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ .bind рдФрд░ .map Failure рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:

 Failure(4).bind(lambda number: Success(number / 2)) # => Failure(4) Failure(4).map(lambda number: number / 2) # => Failure(4) 

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

 Failure(4).rescue(lambda number: Success(number + 1)) # => Success(5) Failure(4).fix(lambda number: number / 2) # => Success(2) 

рд╣рдорд╛рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, "рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ," рдФрд░ "рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдм рдкрд╛рд░рджрд░реНрд╢реА рд╣реИред" рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ рдЬреЛ рд░реЗрд▓ рдкрд░ рд╕рд╡рд╛рд░реА рдХрд░рддрд╛ рд╣реИ!

рд▓реЗрдХрд┐рди рдХрдВрдЯреЗрдирд░реЛрдВ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреИрд╕реЗ рдХрд░реЗрдВ?


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рдореВрд▓реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддрдм рдЖрдк .unwrap() рдпрд╛ .value_or() рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 Success(1).unwrap() # => 1 Success(0).value_or(None) # => 0 Failure(0).value_or(None) # => None Failure(1).unwrap() # => Raises UnwrapFailedError() 

рд░реБрдХреЛ, рд╣рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдерд╛, рдФрд░ рдЕрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рднреА .unwrap() рдХреЙрд▓ рджреВрд╕рд░реЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддреА рд╣реИрдВ?

UnwrapFailedErrors рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдЬрд╛рдП?


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

 from returns.result import Result, Success, Failure class CreateAccountAndUser(object): """Creates new Account-User pair.""" # TODO: we need to create a pipeline of these methods somehow... def _validate_user( self, username: str, email: str, ) -> Result['UserSchema', str]: """Returns an UserSchema for valid input, otherwise a Failure.""" def _create_account( self, user_schema: 'UserSchema', ) -> Result['Account', str]: """Creates an Account for valid UserSchema's. Or returns a Failure.""" def _create_user( self, account: 'Account', ) -> Result['User', str]: """Create an User instance. If user already exists returns Failure.""" 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ:

 class CreateAccountAndUser(object): """Creates new Account-User pair.""" def __call__(self, username: str, email: str) -> Result['User', str]: """Can return a Success(user) or Failure(str_reason).""" return self._validate_user( username, email, ).bind( self._create_account, ).bind( self._create_user, ) # ... 

рд╕рдм рдХреБрдЫ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ .unwrap() рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ .unwrap() рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдРрд╕реЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ? рдирд╣реАрдВред рдФрд░ рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИ? @pipeline :

 from result.functions import pipeline class CreateAccountAndUser(object): """Creates new Account-User pair.""" @pipeline def __call__(self, username: str, email: str) -> Result['User', str]: """Can return a Success(user) or Failure(str_reason).""" user_schema = self._validate_user(username, email).unwrap() account = self._create_account(user_schema).unwrap() return self._create_user(account) # ... 

рдЕрдм рдпрд╣ рдХреЛрдб рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ .unwrap() рдФрд░ @pipeline рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ: рдЬрдм рднреА рдХреЛрдИ .unwrap() рд╡рд┐рдзрд┐ рд╡рд┐рдлрд▓ рд╣реЛрддреА рд╣реИ рдФрд░ Failure[str] , @pipeline рдбреЗрдХреЛрд░реЗрдЯрд░ рдЙрд╕реЗ рдкрдХрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ Failure[str] рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдХреЛрдб рд╕реЗ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд▓рдкреЗрдЯреЗрдВ


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

 from returns.functions import safe @safe def divide(first: float, second: float) -> float: return first / second # is the same as: def divide(first: float, second: float) -> Result[float, ZeroDivisionError]: try: return Success(first / second) except ZeroDivisionError as exc: return Failure(exc) 

@safe рд╕рд╛рде рдкрд╣рд▓рд╛, рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рдФрд░ рдмреЗрд╣рддрд░ рд╣реИред

рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдз рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЦрд┐рд░реА рдЪреАрдЬ @safe рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИ:

 import requests from returns.functions import pipeline, safe from returns.result import Result class FetchUserProfile(object): """Single responsibility callable object that fetches user profile.""" #: You can later use dependency injection to replace `requests` #: with any other http library (or even a custom service). _http = requests @pipeline def __call__(self, user_id: int) -> Result['UserProfile', Exception]: """Fetches UserProfile dict from foreign API.""" response = self._make_request(user_id).unwrap() return self._parse_json(response) @safe def _make_request(self, user_id: int) -> requests.Response: response = self._http.get('/api/users/{0}'.format(user_id)) response.raise_for_status() return response @safe def _parse_json(self, response: requests.Response) -> 'UserProfile': return response.json() 

рдЕрдкрд╡рд╛рдж рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдФрд░ рдХреЛрдб рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ :

  • рдЙрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП @safe рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ Result[OldReturnType, Exception] рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ Result[OldReturnType, Exception] ред
  • рдореВрд▓реНрдпреЛрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╕рд░рд▓ рдЕрдореВрд░реНрддрддрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ Result рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • рдХрдВрдЯреЗрдирд░ рд╕реЗ рдореВрд▓реНрдп рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .unwrap() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди .unwrap рдХреЙрд▓ .unwrap рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП .unwrap @pipeline рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ, рд╣рдо рдПрдХ рд╣реА рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХреЗрд╡рд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдардиреАрдпред рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

  • "рдЕрдкрд╡рд╛рдж рд╕реНрдкреЙрдЯ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИрдВ ред " рдЕрдм рд╡реЗ рдПрдХ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП Result рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реИрдВ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рдмрдирд╛рддрд╛ рд╣реИред
  • "рдЬрдЧрд╣ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ ред " рдЕрдм рдЖрдк рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕реМрдВрдк рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, .fix() рдФрд░ .rescue() ред
  • "рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдХреНрд░рдо рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ ред " рдЕрдм рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╕рд╛рдп рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реИрдВред рд╢реБрд░реВ рд╕реЗ рдЕрдВрдд рддрдХред
  • "рдЕрдкрд╡рд╛рдж рдЕрд╕рд╛рдзрд╛рд░рдг рдирд╣реАрдВ рд╣реИрдВ ред " рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ! рдФрд░ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛ред

рдорд╛рдорд▓реЛрдВ рдФрд░ рд╕реАрдорд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


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

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

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


All Articles