рдкрд╛рдЗрдерди рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯрд┐рдВрдЧ 3. рдмрдЧ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛

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

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

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

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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдХреБрдЫ рдпреБрдХреНрддрд┐рдпреЛрдВ рдФрд░ рддрд░рдХреАрдмреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реВрдБрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБред

рд╕рдорд░реНрдерди 2.5, 3.1 рдФрд░ 3.2 рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрдВ


рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдЭрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЕрдЬрдЧрд░ 2.5 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдЖрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред 3.1 рдФрд░ 3.2 рдХреА рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ, рддреАрд╕рд░реЗ рдкрд╛рдпрдерди рдХреА рдХрдо рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдПред рд▓реЗрдХрд┐рди рдЗрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, 2.6 рдФрд░ 3.3 рдореЗрдВ рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╕рдорд╛рди рдХреЛрдб рдХреЛ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:


рд╣рд╛рдВ, рдЫрд╣ рдореЙрдбреНрдпреВрд▓ рдЖрдкрдХреЛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕реНрд╡рдЪреНрдЫ рдХреЛрдб рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдХрдо рди рд╕рдордЭреЗрдВред рдореИрдВ рдХреЙрд░реА рдиреЗ рддреАрд╕рд░реЗ рдкрд╛рдпрдерди рдЬрд┐рдирдЬрд╛ 2 рдХреЛ рд╕рдорд░реНрдерди рджреЗрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рдЦреЛ рджреА, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЙрд╕рдХреЗ рдХреЛрдб рд╕реЗ рднрдпрднреАрдд рдерд╛ред рдЙрд╕ рд╕рдордп, рд╕рдВрдпреБрдХреНрдд рдХреЛрдб рдмрджрд╕реВрд░рдд рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрдбрд╝рд╛ (рд▓рдЧрд╛рддрд╛рд░ six.b('foo') рдФрд░ six.u('foo') ), рдпрд╛ рдЗрд╕рдХреА рдХрдо рдЧрддрд┐ 2to3 рдереАред рдЕрдм, рдпрд╣ рд╕рдм рдирд┐рдкрдЯрд╛ рдХрд░, рдореИрдВ рдлрд┐рд░ рд╕реЗ рдЖрдирдВрдж рд▓реЗрддрд╛ рд╣реВрдВред Jinja2 рдХреЛрдб рдмрд╣реБрдд рд╕рд╛рдл рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрдЬрдЧрд░ 2 рдФрд░ 3 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рддрд╛ рд╕рдорд░реНрдерди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ред if PY2: рдХреА рд╢реИрд▓реА рдореЗрдВ рдХреБрдЫ рд╣реА рдХреЛрдб рдХреЗ рдХреБрдЫ рдЯреБрдХрдбрд╝реЗ рдХрд░рддреЗ рд╣реИрдВ if PY2:

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

рдЫрд╣ рдХреЛ рдЫреЛрдбрд╝ рджреЛ


рдЫрд╣ рдПрдХ рдмрд╣реБрдд рд╕рд╛рдл-рд╕реБрдерд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдФрд░ рдЬрд┐рдВрдЬрд╛ 2 рдиреЗ рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдХреАред рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЧрд┐рдирддреА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЫрд╣ рдХреЗ рдкрд╛рд╕ рддреАрд╕рд░реЗ рдкрд╛рдпрдерди рдХреЗ рддрд╣рдд рдПрдХ рдмрдВрджрд░рдЧрд╛рд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдиреА рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рд╣реЛрдВрдЧреАред рдпрджрд┐ рдЖрдк рдкрд╛рдпрдерди 2.5 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЫрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди 2.6 рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░, рдЫрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИрдВред Jinja2 рдореЗрдВ _compat рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХ рд╕рд╣рд╛рдпрдХ рд╣реИрдВред рдкрд╛рдпрдерди 3 рдореЗрдВ рдирд╣реАрдВ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реБрдП, рд╕рдВрдкреВрд░реНрдг рд╕рдВрдЧрддрддрд╛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЛрдб рдХреА 80 рд╕реЗ рдХрдо рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдпрд╣ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХрд╛рд░рдг рдкреИрдХреЗрдЬ рдЫрд╣ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рд╢реБрд░реБрдЖрдд рдЖрдзреБрдирд┐рдХреАрдХрд░рдг рд╕реЗ рдХрд░реЗрдВ


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

рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╕рд╣реА рдХрд░реЗрдВ


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

рдПрдХ рд╕рдВрдЧрддрддрд╛ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦреЗрдВ


рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЫрд╣ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рд╣реА рдЙрддреНрддрд░ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдЕрднреА рднреА рдПрдХ рдЫреЛрдЯреЗ рд╕рдВрдЧрддрддрд╛ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЫреЛрдЯрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕рдВрдЧрддрддрд╛ рдореЙрдбреНрдпреВрд▓ рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
 import sys PY2 = sys.version_info[0] == 2 if not PY2: text_type = str string_types = (str,) unichr = chr else: text_type = unicode string_types = (str, unicode) unichr = unichr 

рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХреЛрдб рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИред рдЬрд┐рдирдЬрд╛ 2 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдХрдИ рдХрд╛рд░реНрдп рдХрд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, itilools рд╕реЗ ifilter, imap рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ 3.x рдореЗрдВ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЧрдП рд╣реИрдВ (рдореИрдВ 2.x рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдкрд╛рдардХ рдХреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХреЗ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ )ред

2.x рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВ, 3.x рдирд╣реАрдВ


рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреЛрдб рдЕрдЬрдЧрд░ рдХреЗ 2.x рдпрд╛ 3.x рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ, рдФрд░ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЪреЗрдХ рдХреЛ рджреВрд╕рд░реА рд╢рд╛рдЦрд╛ рдореЗрдВ рд░рдЦреЗрдВ, рдФрд░ рди рдХрд┐ рдХреЛрдХрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдХрдо рдЕрдкреНрд░рд┐рдп рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ рдЬрдм рдЕрдЬрдЧрд░ рдХрд╛ 4 рд╡рд╛рдВ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдЕрдЪреНрдЫрд╛:
 if PY2: def __str__(self): return self.__unicode__().encode('utf-8') 

рдЗрддрдирд╛ рд╕рд╣реА рдирд╣реАрдВ:
 if not PY3: def __str__(self): return self.__unicode__().encode('utf-8') 

рд▓рд╛рдЗрди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


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


рдЗрди рд╕рд░рд▓ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдореИрдВрдиреЗ рдЪрд░ рднреА рдЬреЛрдбрд╝реЗ: text_type , unichr рдФрд░ string_types рдХреЛ рдореЗрд░реЗ рдЕрдиреБрдХреВрд▓рддрд╛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдореНрди рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВ:

рдореИрдВрдиреЗ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ __unicode__ рднреА рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ __unicode__ рдпрд╛ __unicode__ рд╕рд╛рде рдХрдХреНрд╖рд╛рдПрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ:
 if PY2: def implements_to_string(cls): cls.__unicode__ = cls.__str__ cls.__str__ = lambda x: x.__unicode__().encode('utf-8') return cls else: implements_to_string = lambda x: x 

рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ 2.x рдФрд░ 3.x рджреЛрдиреЛрдВ рдореЗрдВ __str__ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдпреВрдирд┐рдХреЛрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рд╣рд╛рдБ, рдпрд╣ 2.x рдореЗрдВ рдХреБрдЫ рднрджреНрджрд╛ рджрд┐рдЦрддрд╛ рд╣реИ), рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реНрд╡рддрдГ рд╣реА рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ __unicode__ рд╕реЗ 2.x рдХрд░ рджреЗрдЧрд╛ред , рдФрд░ __unicode__ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ __unicode__ рдХреЙрд▓ __unicode__ рдФрд░ utf-8 рдХреЛ рдЗрд╕рдХреА рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо __unicode__ ред 2.x рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рд░рд╣рд╛ рд╣реИред рддреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ Jinja2 рдпрд╛ Djangoред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
 @implements_to_string class User(object): def __init__(self, username): self.username = username def __str__(self): return self.username 

рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдкрд░рд┐рд╡рд░реНрддрди


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

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

рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
 def with_metaclass(meta, *bases): class metaclass(meta): __call__ = type.__call__ __init__ = type.__init__ def __new__(cls, name, this_bases, d): if this_bases is None: return type.__new__(cls, name, (), d) return meta(name, bases, d) return metaclass('temporary_class', None, {}) And here is how you use it: class BaseForm(object): pass class FormType(type): pass class Form(with_metaclass(FormType, BaseForm)): pass 

рд╢рдмреНрджрдХреЛрд╢реЛрдВ


рддреАрд╕рд░реЗ рдЕрдЬрдЧрд░ рдореЗрдВ рдХрд╖реНрдЯрдкреНрд░рдж рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдерд╛ред рджреВрд╕рд░реЗ рдкрд╛рдпрдерди рдореЗрдВ, рд╕рднреА рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рдереАрдВ: keys() , values() рдФрд░ items() , рдЬреЛ рд╕реВрдЪрд┐рдпрд╛рдБ рд▓реМрдЯрд╛ рджреА iterkeys() , рдФрд░ iterkeys() , itervalues() рдФрд░ iteritems() , рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ iteritems() рд▓реМрдЯрд╛ iteritems() ред рддреАрд╕рд░реЗ рдЕрдЬрдЧрд░ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЗрдВ рдЙрди рддрд░реАрдХреЛрдВ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред

keys() рдПрдХ рджреГрд╢реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реЗрдЯ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, values() рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрдВрдЯреЗрдирд░ рдХреЛ рд░реАрдб-рдУрдирд▓реА рдХреНрд╖рдорддрд╛ (рд▓реЗрдХрд┐рди рдЗрдЯреНрд░реЗрдЯрд░ рдирд╣реАрдВ!) рдФрд░ items() рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реЗрдЯ рдХреЗ рд╕рдорд╛рди рджреЗрддрд╛ рд╣реИред рдирд┐рдпрдорд┐рдд рд╕реЗрдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╡реЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рднреА рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ рддреЛ рдХреБрдЫ рддрд░реАрдХреЗ рдЧрд┐рд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЛрдЧ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдирд╣реАрдВ рд╣реИрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Werkzeug рдФрд░ Django рдЕрдкрдиреА рдЦреБрдж рдХреА рд╢рдмреНрджрдХреЛрд╢ рдЬреИрд╕реА рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдерд╛ рдФрд░ keys() рдФрд░ рдЙрд╕рдХреЗ рджреЛрд╕реНрддреЛрдВ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ keys() рджреЗрдирд╛ рдерд╛ред

рдлрд┐рд▓рд╣рд╛рд▓, рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬреЛ рдЙрди рд╕реАрдорд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╣реИ рдЬреЛ рдЕрдЬрдЧрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

рдпрд╣рд╛рдБ рд╣реИ рдХреНрдпрд╛ рдЬрд┐рдирдЬрд╛ 2 рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ:
 if PY2: iterkeys = lambda d: d.iterkeys() itervalues = lambda d: d.itervalues() iteritems = lambda d: d.iteritems() else: iterkeys = lambda d: iter(d.keys()) itervalues = lambda d: iter(d.values()) iteritems = lambda d: iter(d.items()) 

рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдЬреИрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИ:
 if PY2: def implements_dict_iteration(cls): cls.iterkeys = cls.keys cls.itervalues = cls.values cls.iteritems = cls.items cls.keys = lambda x: list(x.iterkeys()) cls.values = lambda x: list(x.itervalues()) cls.items = lambda x: list(x.iteritems()) return cls else: implements_dict_iteration = lambda x: x 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ keys() рдкрджреНрдзрддрд┐ рдФрд░ рдЙрд╕рдХреЗ рдорд┐рддреНрд░реЛрдВ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЕрдкрдиреЗ рдЖрдк рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
 @implements_dict_iteration class MyDict(object): ... def keys(self): for key, value in iteritems(self): yield key def values(self): for key, value in iteritems(self): yield value def items(self): ... 

рд╕рд╛рдорд╛рдиреНрдп рдЗрдЯрд░реЗрдЯрд░ рдкрд░рд┐рд╡рд░реНрддрди


рдЪреВрдВрдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдиреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХрдорд╛рддреНрд░ рдкрд░рд┐рд╡рд░реНрддрди next() рд╕реЗ __next__ рддрдХ рд╕рдВрдХреНрд░рдордг рдерд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ next(x) рдкрд░ x.next() рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЕрдЬрдЧрд░ рдмрд╛рдХреА рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░реЗрдЧрд╛ред

рдпрджрд┐ рдЖрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдлрд┐рд░ рд╕реЗ, рдПрдХ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдорджрдж рдХрд░реЗрдЧрд╛:
 if PY2: def implements_iterator(cls): cls.next = cls.__next__ del cls.__next__ return cls else: implements_iterator = lambda x: x 

рдХрдХреНрд╖рд╛ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрджрдо рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдирд╛рдо __next__ :
 @implements_iterator class UppercasingIterator(object): def __init__(self, iterable): self._iter = iter(iterable) def __iter__(self): return self def __next__(self): return next(self._iter).upper() 


рдХреЛрдбреЗрдХреНрд╕ рдмрджрд▓реЗрдВ


рджреВрд╕рд░реЗ рдЕрдЬрдЧрд░ рдореЗрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдорд╣рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЗрд╕рдХреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдереАред рдЖрдк рдПрдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╕реАрдПрд╕рд╡реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╕рд░рдгреА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рдереА, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рджрд░реНрд╢рдиреЛрдВ рдХреЗ рджреМрд░рд╛рди, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдореБрдЦреНрдп рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдереЗред 3.x рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ рд╡реЗ рдЕрдзрд┐рдХ рд╕рдЦреНрдд рд╣реЛ рдЧрдП, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ 3.0 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛, рдФрд░ 3.3 рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╕рд╛рдмрд┐рдд рд╣реБрдЖред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рддреЛ рдХреЛрдбреЗрдХреНрд╕ рдЬреЛ рдпреВрдирд┐рдХреЛрдб рдФрд░ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмреАрдЪ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, 3.3 рддрдХ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдереЗред рдЙрдирдореЗрдВ рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реЗрдХреНрд╕ рдФрд░ рдмреЗрд╕ 64 рдХреЛрдбреЗрдХреНрд╕ред

рдЗрди рдХреЛрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ: рд▓рд╛рдЗрди рдСрдкрд░реЗрд╢рди рдФрд░ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдСрдкрд░реЗрд╢рдиред 2.x рд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреБрд░рд╛рдирд╛ str.encode() рдЕрдм str.encode() рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдмрджрд▓рддреЗ рдПрдкреАрдЖрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП 2.x рдФрд░ 3.x рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
 >>> import codecs >>> codecs.encode(b'Hey!', 'base64_codec') 'SGV5IQ==\n' 

рдЖрдк рдпрд╣ рднреА рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ 3.3 рдореЗрдВ рдХреЛрдбреЗрдХреНрд╕ рдиреЗ рдЙрдкрдирд╛рдо рдЦреЛ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ 'base64' рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ 'base64_codec' рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдЗрди рдХреЛрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ Binacsii рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдзрд╛рд░рд╛рдУрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ ред

рдЕрдиреНрдп рдиреЛрдЯ


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


рдирд┐рд╖реНрдХрд░реНрд╖


2.x рдФрд░ 3.x рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ рдХреЛрдб рдЖрдЬ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред , , , API . , , 2.5, 3.0-3.2, .

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


All Articles