
рдореИрдВ рдкрд╛рдВрдЪ рд╕рд╛рд▓ рд╕реЗ рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд┐рдЫрд▓реЗ рддреАрди рд╕рд╛рд▓ рд╕реЗ рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдореЗрд░реА рдЯреАрдо рдЗрд╕рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░рддреА рд╣реИред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЕрд╕рдорд░реНрдерд┐рдд рдХреЛрдб рд╕реЗ рдПрдХ рдЧрдбрд╝рдмрдбрд╝ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓ рдЬрд╛рдП; рд╣рдо рдЪрдХреНрд░реАрдп рдЖрдпрд╛рдд, рдЖрдкрд╕реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддреЗ рд╣реИрдВ, рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдореЙрдбреНрдпреВрд▓ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкрд╛рдпрдерди рд╕рдореБрджрд╛рдп рдореЗрдВ "рдЕрдЪреНрдЫреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛" рдХреА рдХреЛрдИ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ "рдЕрдЬрдЧрд░" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд╛рде рдЖрдирд╛ рд╣реЛрдЧрд╛ред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд - рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХреЗ рд╕рд╛рде, рдФрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ - рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрди рдкрд░ рдкрд╛рдпрдерди рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
django.setup ()
рдореИрдВ dzhangists рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╢реНрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдЧрд╛ рдХреНрдпрд╛ рдЖрдк рдЕрдХреНрд╕рд░ рдЗрди рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ?
import django django.setup()
рдпрджрд┐ рдЖрдк рд╕реНрд╡рдпрдВ django рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ django рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдордп (
django.utils.timezone
), рдФрд░
django.urls.reverse
(
django.urls.reverse
), рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдФрд░ рдЯреВрд▓ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
рдореИрдВ рдЗрди рджреЛрдиреЛрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЗрдЬреЗрдХреНрд╢рди рдХреЛрдб рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВ; рдореИрдВ рдПрдХ рдЕрд▓рдЧ
.py
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ
.py
рд╣реВрдВ, рдЗрд╕рдХрд╛ рдкрддрд╛
.py
рд╣реВрдВ - рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реВрдВред
рдФрд░ рдпрд╣ рдирд┐рд░рдВрддрд░
django.setup()
рдореБрдЭреЗ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рдЗрд╕реЗ рд╣рд░ рдЬрдЧрд╣ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП рдердХ рдЬрд╛рддреЗ рд╣реИрдВ; рдФрд░, рджреВрд╕рд░реА рдмрд╛рдд, django рдЖрд░рдВрднреАрдХрд░рдг рдореЗрдВ рдХреБрдЫ рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ (рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрдбрд╝рд╛ рдореЛрдиреЛрд▓рд┐рде рд╣реИ), рдФрд░ рдЬрдм рдЖрдк рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рдХреЛ 10, 20, 100 рдмрд╛рд░ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ - рддреЛ рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред
рдХреИрд╕реЗ
django.setup()
рдЫреБрдЯрдХрд╛рд░рд╛
django.setup()
? рдЖрдкрдХреЛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ django рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рдмрд╛рд╣рд░реА API рдХрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ django рдкрд░ рдирд┐рд░реНрднрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
from django.conf import settings class APIClient: def __init__(self): self.api_key = settings.SOME_API_KEY
рдпрд╛ рдпрд╣ django рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
class APIClient: def __init__(self, api_key): self.api_key = api_key
рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд░реНрдорд╛рддрд╛ рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рд╣реЗрд░рдлреЗрд░ рдкреВрд░реЗ dzhangovskoy рдорд╢реАрдирд░реА рдХреЛ рд▓реЛрдб рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЯреЗрд╕реНрдЯ рднреА рдЖрд╕рд╛рди рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рдШрдЯрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ рдЬреЛ
django.conf.settings
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ? рдмрд╕ рдЙрдиреНрд╣реЗрдВ
@override_settings
рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд▓реЙрдХ рдХрд░реЗрдВред рдФрд░ рдЕрдЧрд░ рдШрдЯрдХ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЧреАрд▓рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛: рдЙрд╕рдиреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ - рдФрд░ рдЙрд╕реЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ред
рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрди
django
рдирд┐рд░реНрднрд░рддрд╛ рдХрд╣рд╛рдиреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рд╣рдбрд╝рддрд╛рд▓реА рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╣рд░ рджрд┐рди рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ: рдЕрдЬрдЧрд░ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрди рд╕рдорд╕реНрдпрд╛рдПрдВ - рдФрд░ рдЕрдЬрдЧрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╕рдордЧреНрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ред
рдкрд╛рдпрдерди рд╕рдореБрджрд╛рдп рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рдорд┐рд╢реНрд░рд┐рдд рд╣реИред рддреАрди рдореБрдЦреНрдп рд╢рд┐рд╡рд┐рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдЕрдЬрдЧрд░ рдПрдХ рд▓рдЪреАрд▓реА рднрд╛рд╖рд╛ рд╣реИред рд╣рдо рдЬреИрд╕рд╛ рдЪрд╛рд╣реЗрдВ рд╡реИрд╕рд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╣рдо рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╣рдо рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд░реНрдореАрд▓реА рдирд╣реАрдВ рд╣реИрдВ, рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЖрджрд┐ред
- рдЕрдЬрдЧрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рднрд╛рд╖рд╛ рд╣реИред рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рддрд░реАрдХреЗ рд╣реИрдВред рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдЕрдк рдФрд░ рдбрд╛рдЙрди рдХреЙрд▓ рд╕реНрдЯреИрдХ iterators, coroutines рдФрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдХреНрд╖рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рдЙрджрд╛рд╣рд░рдгрдмреНрд░реИрдВрдбрди рд░реЛрдбреНрд╕, рдбреНрд░реЙрдкрдмреЙрдХреНрд╕:
рдЕрдкрдиреЗ рдЖрдЗрдУ рдХреЛ рдлрд╣рд░рд╛рдПрдВ ред
рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ рдЙрджрд╛рд╣рд░рдг:
def main(): """ """ with open("/etc/hosts") as file: for line in parse_hosts(file): print(line) def parse_hosts(lines): """ - """ for line in lines: if line.startswith("#"): continue yield line
- рдкрд╛рдпрдерди рдХрд╛ рд▓рдЪреАрд▓рд╛рдкрди рдкреИрд░ рдореЗрдВ рдЦреБрдж рдХреЛ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХрд╛ рд╣реИред рдЖрдкрдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рдХрдареЛрд░ рд╕реЗрдЯ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд░реВрд╕реА рд╕реВрдЦрд╛-рдЕрдЬрдЧрд░ рд▓реЛрдЧ рд╣реИрдВред рдЕрднреА рднреА рдПрдХ рдХрдо рдХрдЯреНрдЯрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ - рдкреИрдорд╛рдиреЗ рдФрд░ рджреАрд░реНрдШрд╛рдпреБ рдХреЗ рд▓рд┐рдП Django рд╕рдВрд░рдЪрдирд╛ , рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рд╕рдорд╛рди рд╣реИред
рдЕрдЬрдЧрд░ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрди рдкрд░ рдХрдИ рд▓реЗрдЦ рд╣реИрдВ (
рдЙрджрд╛рд╣рд░рдг 1 ,
рдЙрджрд╛рд╣рд░рдг 2 ), рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдХрд┐рд╕реА рдХреЗ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдврд╛рдВрдЪреЗ рдХреЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддреЗ рд╣реИрдВред рдпрд╣ рд▓реЗрдЦ рдЙрд╕реА рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдпрд╣ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╢реБрджреНрдз рд╡рд┐рдЪрд╛рд░ рд╣реИред рдпрд╣ рдКрдкрд░ рджрд┐рдП рдЧрдП рддреАрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдврд╛рдБрдЪреЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рдВрддреБрд▓рди рдЦреЛрдЬрдиреЗ рдФрд░ рдЗрд╕реЗ "рдкрд╛рдпрдереЛрдирд┐рдХ" рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рдпрд╛рд╕ рд╣реИред
рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ
рдХреНрд▓реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрдврд╝рд╛ - рдФрд░ рдореБрдЭреЗ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЕрдЬрдЧрд░ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдореВрд▓реНрдп рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рджреЗрдЦрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣
рдХреЛрдб рдХреЛ рджреВрд╕рд░реЗ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ ред
рд╕реНрд░реЛрдд рдбреЗрдЯрд╛
рдПрдХ рдПрдкреАрдЖрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ рдЬреЛ рд╕реЗрд╡рд╛ рд╢реЙрд░реНрдЯрдирд░ рдХреЗ рд▓рд┐рдП HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ:
рдФрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рдкрд╛рда рдХреЗ рд╕рднреА рд▓рд┐рдВрдХ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣ рд╢реЙрд░реНрдЯрдирд░ рдПрдкреАрдЖрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рддрд░реНрдХ рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдВрддреНрд░рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ (рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╣рддреЗ рд╣реИрдВ):
рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд╛рда рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рд╢реЙрд░реНрдЯрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВ:

рд╕рдорд╕реНрдпрд╛
рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ:
TextProcessor
рд╡рд░реНрдЧ
ShortenerClient
рд╡рд░реНрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ - рдФрд░
рдЬрдм ShortenerClient
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрджрд▓рддрд╛ рд╣реИ рддреЛ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ ред
рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдордиреЗ
shorten_link
рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ рдФрд░
shorten_link
рддрд░реНрдХ рдХреЛ
shorten_link
рд╡рд┐рдзрд┐ рдореЗрдВ
shorten_link
рд╣реИред рдЗрд╕ рддрд░реНрдХ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╕рдордп рдХрд┐рди рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред
ShortenerClient.shorten_link
рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рд╢реБрд░реВ рд╣реБрдИ:
def shorten_link(self, url, callback_url): response = requests.post( url='https://fstrk.cc/short', headers={'Authorization': self.api_key}, json={'url': url, 'callback_on_click': callback_url} ) return response.json()['url']
рдФрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
TypeError: shorten_link() missing 1 required positional argument: 'callback_url'
рдпрд╣реА рд╣реИ, рд╣рдордиреЗ рд╢реЙрд░реНрдЯрдирд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рдерд╛ рдЬреЛ рдЯреВрдЯ рдЧрдпрд╛, рдмрд▓реНрдХрд┐ рдЙрд╕рдХрд╛ рдЧреНрд░рд╛рд╣рдХ:

рддреЛ рдХреНрдпрд╛? рдЦреИрд░, рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдЯреВрдЯ рдЧрдИ, рд╣рдордиреЗ рдЬрд╛рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ред рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ?
рдпрджрд┐ рдЗрд╕реЗ рдПрдХ рдорд┐рдирдЯ рдореЗрдВ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡реЗ рдЧрдП рдФрд░ рд╕рд╣реА рдХрд┐рдП рдЧрдП - рддреЛ рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдХреЛрдб рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдирд╛ рд╕рдорд░реНрдерди рджреЗрддреЗ рд╣реИрдВ (рдпрд╣ рдЖрдкрдХреА рд╕рд╛рдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рддреЛ рдпреЗ рдПрдХ рд╣реА рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рджреЛ рдЫреЛрдЯреЗ рд╡рд░реНрдЧ рд╣реИрдВ, рдЖрджрд┐), рддреЛ рдЖрдк рд╡рд╣рд╛рдВ рд░реБрдХ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдорд╕реНрдпрд╛рдПрдБ рддрдм рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ рдЬрдм:
- рдХреЙрд▓рд┐рдВрдЧ рдФрд░ рдмреБрд▓рд╛рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реИрдВ;
- рд╡рд┐рднрд┐рдиреНрди рдореЙрдбреНрдпреВрд▓ рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдЧреЛрдВ / рдЯреАрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред
рдпрджрд┐ рдЖрдк
ShortenerClient
рд╡рд░реНрдЧ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХрд╛ рд╕рд╣рдпреЛрдЧреА
TextProcessor
рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЖрдХреНрд░рд╛рдордХ рд╕реНрдерд┐рддрд┐ рдорд┐рд▓рддреА рд╣реИ:
рдЖрдкрдиреЗ рдХреЛрдб рдмрджрд▓ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЯреВрдЯ рдЧрдпрд╛ред рдФрд░ рдпрд╣ рдПрдХ рдРрд╕реА рдЬрдЧрд╣ рдЯреВрдЯ рдЧрдпрд╛ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдЬреАрд╡рди рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рдЕрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдкрдХрд╛ рдореЙрдбреНрдпреВрд▓ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдореЗрдВ рдирд╣реАрдВ; рдФрд░ рдЖрдкрдХрд╛ рд╕рдВрдкрд╛рджрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдвреЗрд░ рдкрд░ рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдЬрдм
ShortenerClient
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрджрд▓ рдЬрд╛рдП, рддреЛ
ShortenerClient
рд╕реНрд╡рдпрдВ ShortenerClient
, рди рдХрд┐ рдЗрд╕рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛ (рдХрдИ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)?
рдпрд╣рд╛рдБ рд╕рдорд╛рдзрд╛рди рд╣реИ:
- рдХреНрд▓рд╛рд╕ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдФрд░ рд╡рд░реНрдЧ рдХреЛ рд╕реНрд╡рдпрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╕рд╣рдордд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛рдиреВрди рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдпрджрд┐ рд╡рд░реНрдЧ рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рддреЛ рдпрд╣ рдЙрд╕рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреА, рди рдХрд┐ рдЙрдкрднреЛрдХреНрддрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВред

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдлреНрд░реАрдЬ рдХрд░реЗрдВ
рдЕрдЬрдЧрд░ рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХреНрдпрд╛ рджрд┐рдЦрддрд╛ рд╣реИ? рдпрд╣ рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рд╣реИ:
from abc import ABC, abstractmethod class AbstractClient(ABC): @abstractmethod def __init__(self, api_key): pass @abstractmethod def shorten_link(self, link): pass
рдпрджрд┐ рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдорд┐рд▓реА рд╣реИ рдФрд░ рд╣рдо рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:
class ShortenerClient(AbstractClient): def __ini__(self, api_key): self.api_key = api_key client = ShortenerClient('123') >>> TypeError: Can't instantiate abstract class ShortenerClient with abstract methods __init__, shorten_link
рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдХреЗрд╡рд▓ рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВред
рджреВрд╕рд░реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рддреНрдпрд╛рдкрди рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╣ рджреВрд╕рд░рд╛ рдЙрдкрдХрд░рдг
mypy
ред рдпрд╣ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
рдЕрдЧрд░ рд╣рдо рдЕрдм рдЗрд╕ рдХреЛрдб рдХреЛ
mypy
рдХреЗ рд╕рд╛рде
mypy
, рддреЛ рд╣рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд
mypy
рддрд░реНрдХ рдХреЗ рдХрд╛рд░рдг рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
mypy shortener_client.py >>> error: Signature of "shorten_link" incompatible with supertype "AbstractClient"
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрд▓рд╛рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХрд╛ рд╣реИред
рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрд▓рдЯрд╛
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ
shortener_client.py
рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЙрдкрднреЛрдХреНрддрд╛ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рджреВрд╕рд░реА рдЬрдЧрд╣ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реАрдзреЗ рдЙрдкрднреЛрдХреНрддрд╛ рддрдХ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ -
TextProcessor
рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ:
рдФрд░ рд╡рд╣ рд▓рдд рдХреА рджрд┐рд╢рд╛ рдмрджрд▓ рджреЗрдЧрд╛! рдЕрдм
TextProcessor
рдЗрдВрдЯрд░реЗрдХреНрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк,
ShortenerClient
рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВред

рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
TextProcessor
рдХрд╣рддрд╛ рд╣реИ: рдореИрдВ рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЯреЗрдХреНрд╕реНрдЯ рд░реВрдкрд╛рдВрддрд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реВрдВред рдореИрдВ рдЫреЛрдЯрд╛ рддрдВрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛: рдпрд╣ рдореЗрд░рд╛ рд╡реНрдпрд╡рд╕рд╛рдп рдирд╣реАрдВ рд╣реИред рдореИрдВ shorten_link
рд╡рд┐рдзрд┐ рдХреЛ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ shorten_link
рдХрд░ рджреЗред рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛, рдореБрдЭреЗ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рджреЗрдВ рдЬреЛ рдореЗрд░реЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЪрд▓реЗред рдореИрдВ рдХреИрд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╣реИрдВредShortenerClient
рдХрд╣рддрд╛ рд╣реИ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╢реВрдиреНрдп рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореБрдЭрд╕реЗ рдХреБрдЫ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВ рдкреВрдЫрддрд╛ TextProcessor
рдХрд┐ TextProcessor
рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдмреНрд░реЗрдХ рди рд╣реЛред
рдХрдИ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ
рдпрджрд┐ рдХрдИ рдореЙрдбреНрдпреВрд▓ рдЫреЛрдЯреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЬреЛ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдКрдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдЙрдЪреНрдЪ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ:

рдирд┐рдпрдВрддреНрд░рдг рдШрдЯрдХ
рдпрджрд┐ рдЙрдкрднреЛрдХреНрддрд╛
ShortenerClient
рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреМрди рдЗрд╕реЗ рдЖрдпрд╛рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛? рдпрд╣ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдШрдЯрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣
controller.py
ред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рд╕реАрдзрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реИ, рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди "рдорд╛рдереЗ рдореЗрдВ"ред рд╣рдо рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рддреЗ рд╣реИрдВред рд▓рд╛рднред
рдЕрдЬрдЧрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг
рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ "рдкрд╛рдЗрдереЛрдирд┐рдХ" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рд░реЗрдордВрдб рд╣реЗрдЯрд┐рдВрдЧрд░ рдиреЗ рдЕрдкрдиреА рд╕реБрдкрд░ рдорд╛рдиреА рд╕реБрдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХреА рд╣реИред рдЗрд╕ рд╢реИрд▓реА рдореЗрдВ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
TextProcessor
рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдиреЗ рдХреА
TextProcessor
, рдЬрд┐рд╕рд╕реЗ рдпрд╣
TextProcessor
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
рдФрд░ рдлрд┐рд░, рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ, рдЗрд╕реЗ рд╡рд╛рд░рд┐рд╕ рдХрд░реЗрдВ:
рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рд▓реЛрдХрдкреНрд░рд┐рдп рдврд╛рдБрдЪреЛрдВ рдореЗрдВ рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рд╣реИ:
- Django рдореЗрдВ, рд╣рдо рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред рд╣рдо рдХреНрд▓рд╛рд╕-рдЖрдзрд╛рд░рд┐рдд рджреГрд╢реНрдп, рдореЙрдбрд▓, рд░реВрдкреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ; рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рдмрдЧ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдореЗрдВ рд╣рдорд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред
- рдбреАрдЖрд░рдПрдл рдореЗрдВ, рдПрдХ рд╣реА рдмрд╛рддред рд╣рдо рд╡рд┐рдЪрд╛рд░, рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ, рдЕрдиреБрдорддрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
- рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╕реБрдВрджрд░ рдФрд░ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдЖрдЗрдП рдЗрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реБрдВрджрд░рддрд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИред
рдЕрдЬрдЧрд░ рдХрд╛ рд╡рд┐рдХрд╛рд╕
рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдореЗрдВ, рдЖрдорддреМрд░ рдкрд░ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░рд╛
TextProcessor
рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓
TextProcessor
TextPipeline
рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдкрд╛рда рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдореЗрд▓ рдкрд░ рднреЗрдЬрддрд╛ рд╣реИ:
class TextPipeline: def __init__(self, text, email): self.text_processor = TextProcessor(text) self.mailer = Mailer(email) def process_and_mail(self) -> None: processed_text = self.text_processor.process() self.mailer.send_text(text=processed_text)
рдпрджрд┐ рд╣рдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЧрдИ рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ
TextPipeline
рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
TextPipeline
рд╡рд░реНрдЧ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдЧрд╛;- рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдШрдЯрдХреЛрдВ рдХреЛ рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛;
- рдХреБрдЫ рдмрд╛рд╣рд░реА рдХреЛрдб рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдВрдЧреЗ рдФрд░ рдЪрд▓рд╛рдПрдВрдЧреЗред
рдирд┐рд░реНрднрд░рддрд╛ рдЖрд░реЗрдЦ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

рд▓реЗрдХрд┐рди рдЗрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХрд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛрдб рдЕрдм рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛?
import TextProcessor import ShortenerClient import Mailer import TextPipeline class ProcessorWithClient(TextProcessor): def get_shortener_client(self) -> ShortenerClient: return ShortenerClient(api_key='123') class PipelineWithDependencies(TextPipeline): def get_text_processor(self, text: str) -> ProcessorWithClient: return ProcessorWithClient(text) def get_mailer(self, email: str) -> Mailer: return Mailer(email) pipeline = PipelineWithDependencies( email='abc@def.com', text=' 1: https://ya.ru 2: https://google.com' ) pipeline.process_and_mail()
рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЧреМрд░ рдХрд┐рдпрд╛ рд╣реИ? рд╣рдо рдкрд╣рд▓реА рдмрд╛рд░
TextProcessor
рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрд╕рдореЗрдВ
TextProcessor
рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реЗ
TextProcessor
(рд╕рд╛рде рд╣реА
Mailer
) рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
TextPipeline
рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдкреБрдирд░реНрд╡рд┐рддреНрдд рдХреЗ рдХрдИ рд╕реНрддрд░ рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрдЯрд┐рд▓ рд╣реИред
рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рднреА рдЪреМрдЦрдЯреЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХреНрдпреЛрдВ рд╣реИрдВ?
рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред- рдврд╛рдВрдЪреЗ рдХреЗ рд╕рднреА рд╕реНрддрд░реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд┐рдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Django рдореЗрдВ, рдЖрдк
Form
рдУрд╡рд░рд░рд╛рдЗрдб рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП FormField
рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝реЙрд░реНрдо рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдПред рд╡рд╣ рд╕рдм рд╣реИред рддреАрди рд╕реНрддрд░ред - рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред
- рдкреНрд░рддреНрдпреЗрдХ рд░реВрдкрд░реЗрдЦрд╛ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдФрд░ рдХреНрдпрд╛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ; рдХреНрдпрд╛ рдФрд░ рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдЧрдардмрдВрдзрди рдХрд░рдирд╛ рд╣реИред
рдХреНрдпрд╛ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреА рдкрд╣рдЪрд╛рди рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рд╕реНрддрд░ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдореИрдВ рдирд╣реАрдВ рдХрд░рддрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд░реЗрдордВрдб рд╣реЗрдЯрд┐рдВрдЧрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИред
рдорд╛рдереЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд╛рдкрд╕
рдХрдИ рдХрдард┐рдирд╛рдИ рд╕реНрддрд░реЛрдВ рдкрд░, рдПрдХ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреАрддрддрд╛ рд╣реИред рдпрд╣ рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИ - рдФрд░ рдЬрдм рддрд░реНрдХ рдмрджрд▓рддрд╛ рд╣реИ рддреЛ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред
import TextProcessor import ShortenerClient import Mailer import TextPipeline pipeline = TextPipeline( text_processor=TextProcessor( text=' 1: https://ya.ru 2: https://google.com', shortener_client=ShortenerClient(api_key='abc') ), mailer=Mailer('abc@def.com') ) pipeline.process_and_mail()
рд▓реЗрдХрд┐рди, рдЬрдм рддрд░реНрдХ рдХреЗ рд╕реНрддрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рддреЛ рднреА рдРрд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ рдХрдИ рд╕реНрддрд░реЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдЪрд▓реЛ рдПрдХ рдФрд░ рдХреЙрд▓ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЛред
рдЧреНрд▓реЛрдмрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реНрдЯреЛрд░реЗрдЬ
рдЖрдЗрдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЬрд┐рди рдШрдЯрдХреЛрдВ рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ рдЙрдирдХреЗ рдЙрджрд╛рд╣рд░рдг рдЭреВрда рд╣реЛрдВрдЧреЗред рдФрд░ рдЗрди рдШрдЯрдХреЛрдВ рдХреЛ рдЗрд╕ рд╢рдмреНрджрдХреЛрд╢ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рджреЗрдВред
рдЪрд▓реЛ рдЗрд╕реЗ
INSTANCE_DICT
рдХрд╣рддреЗ рд╣реИрдВ:
рдЯреНрд░рд┐рдХ
рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЗрд╕ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд░рдЦрдирд╛ рд╣реИ ред рдпрд╣ рд╣рдо рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ
controller.py
:
рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн:
- рдХреЛрдИ рдЗрдВрдЬрди рд╣реБрдб рдЬрд╛рджреВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд DI рдЪреМрдЦрдЯреЗ;
- рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдПрдХ рдлреНрд▓реИрдЯ рд╕реВрдЪреА рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ;
- рд╕рднреА DI рдмреЛрдирд╕: рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг, рд╕реНрд╡рддрдВрддреНрд░рддрд╛, рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХреЗ рдмрджрд▓рдиреЗ рдкрд░ рдЯреВрдЯрдиреЗ рд╕реЗ рдШрдЯрдХреЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ред
рдмреЗрд╢рдХ,
INSTANCE_DICT
рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ DI рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рд░реВрдкрд░реЗрдЦрд╛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдкреНрд░рдмрдВрдзрди рдкреНрд░рджрд╛рди рдХрд░реЗрдЧреА; рд╡рд╣ рдЖрдкрдХреЛ рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреА рддрд░рд╣ рдПрдХрд▓ рдпрд╛ рдмрдВрдбрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛; рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рд╡рд╣реА рд░рд╣реЗрдЧрд╛ред
рд╢рд╛рдпрдж рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдореИрдВ рдЕрднреА рднреА рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдЪреБрдирддрд╛ рд╣реВрдВред
рдФрд░, рд╢рд╛рдпрдж, рдпрд╣ рд╕рдм рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ: рдкреНрд░рддреНрдпрдХреНрд╖ рдЖрдпрд╛рдд рд▓рд┐рдЦреЗрдВ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рди рдмрдирд╛рдПрдВред
рдЕрдЬрдЧрд░ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рдЕрдиреБрднрд╡ рдХреНрдпрд╛ рд╣реИ? рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ - рдХреНрдпрд╛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рд╣рд╡рд╛ рд╕реЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?