@Pythonetc рдЕрдЧрд╕реНрдд 2018



рдпрд╣ рдореЗрд░реА @pythonetc рдлреАрдб рд╕реЗ рдкрд╛рдпрдерди рдЯрд┐рдкреНрд╕ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рддреАрд╕рд░рд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдЪрдпрди:



рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐


рдпрджрд┐ рдЖрдк __init__ рдЕрдВрджрд░ рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рдореАрдЪреАрди рд╣реИ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рддрдХрдиреАрдХреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдЧрд╛ред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, __init__ host рдФрд░ port рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ host :

 class Query: def __init__(self, host, port): self._connection = Connection(host, port) 

рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк:

 class Query: def __init__(self, connection): self._connection = connection @classmethod def create(cls, host, port): return cls(Connection(host, port)) 

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХрдо рд╕реЗ рдХрдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдн рд╣реИрдВ:

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

рд╕реБрдкрд░ рдпрд╛ рдЕрдЧрд▓рд╛


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

 class BaseTestCase(TestCase): def setUp(self): self._db = create_db() class UserTestCase(BaseTestCase): def setUp(self): super().setUp() self._user = create_user() 

рд╕реБрдкрд░ рдирд╛рдо рдХрд╛ рдорддрд▓рдм рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ "рд╕реБрдкрд░"ред рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЙрдЪреНрдЪ рд╢реНрд░реЗрдгреА рдореЗрдВ" (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рдмреНрдж "рдЕрдзреАрдХреНрд╖рдХ")ред рдЙрд╕реА рд╕рдордп, super() рд╣рдореЗрд╢рд╛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдЪрд╛рдЗрд▓реНрдб рдХреНрд▓рд╛рд╕ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП next() рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛрдЧрд╛ next() , рдЪреВрдВрдХрд┐ рдЕрдЧрд▓реА рдХрдХреНрд╖рд╛ рдХреЛ рдПрдордЖрд░рдУ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 class Top: def foo(self): return 'top' class Left(Top): def foo(self): return super().foo() class Right(Top): def foo(self): return 'right' class Bottom(Left, Right): pass # prints 'right' print(Bottom().foo()) 

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ super() рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред

 >>> Bottom().foo() 'right' >>> Left().foo() 'top' 


рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдирд╛рдо рд╕реНрдерд╛рди


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

 class Meta(type): def __new__(meta, name, bases, ns): print(ns) return super().__new__( meta, name, bases, ns ) class Foo(metaclass=Meta): B = 2 

рдпрд╣ рдХреЛрдб {'__module__': '__main__', '__qualname__':'Foo', 'B': 3} ред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЕрдЧрд░ рдЖрдк B = 2; B = 3 рдЬреИрд╕рд╛ рдХреБрдЫ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ B = 2; B = 3 B = 2; B = 3 , рдлрд┐рд░ рдореЗрдЯрд╛рдХреНрд▓реЗрдЬрд╝ рдХреЗрд╡рд▓ B = 3 рдХреЛ рджреЗрдЦреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рди ns ред рдпрд╣ рд╕реАрдорд╛ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЙрдкрдЬреА рд╣реИ рдХрд┐ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╢рд░реАрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред

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

 class CustomNamespace(dict): def __setitem__(self, key, value): print(f'{key} -> {value}') return super().__setitem__(key, value) class Meta(type): def __new__(meta, name, bases, ns): return super().__new__( meta, name, bases, ns ) @classmethod def __prepare__(metacls, cls, bases): return CustomNamespace() class Foo(metaclass=Meta): B = 2 B = 3 

рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдкрд░рд┐рдгрд╛рдо:

 __module__ -> __main__ __qualname__ -> Foo B -> 2 B -> 3 

рдЗрд╕ рдкреНрд░рдХрд╛рд░ enum.Enum рдирдХрд▓ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

matplotlib


matplotlib рдЪрд╛рд░реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЯрд┐рд▓ рдФрд░ рд▓рдЪреАрд▓рд╛ рдкрд╛рдЗрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рдХрдИ рдЙрддреНрдкрд╛рдж рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЬреБрдкрд┐рдЯрд░ рдФрд░ рдкреАрдЪрд╛рд░реНрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣рд╛рдБ matplotlib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рднрдЧреНрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://repl.it/@VadimPushtaev/myplotlib (рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдХреА рд╢реАрд░реНрд╖рдХ рдЫрд╡рд┐ рджреЗрдЦреЗрдВ)ред

рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╕рдорд░реНрдерди


рдЕрдЬрдЧрд░ рддрд╛рд░реАрдЦреЛрдВ рдФрд░ рд╕рдордп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА datetime рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрддреНрд╕реБрдХ рд╣реИ рдХрд┐ datetime рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╕рдордп рдХреНрд╖реЗрддреНрд░ (рдЕрд░реНрдерд╛рдд, tzinfo рд╡рд┐рд╢реЗрд╖рддрд╛) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рд╕реАрдорд┐рдд рд╕рдорд░реНрдерди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд╛рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред

рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп pytz ред рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ pytz рдкреВрд░реА рддрд░рд╣ рд╕реЗ tzinfo рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ pytz рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ: "рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп tzinfo рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрд┐рдд рдЕрдЬрдЧрд░ рдПрдкреАрдЖрдИ рд╕реЗ рдЕрд▓рдЧ рд╣реИред"

рдЖрдк tzinfo рд░реВрдк рдореЗрдВ tzinfo pytz рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рдЧрд▓ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХрд╛ рдЦрддрд░рд╛ рд╣реИ:

 In : paris = pytz.timezone('Europe/Paris') In : str(datetime(2017, 1, 1, tzinfo=paris)) Out: '2017-01-01 00:00:00+00:09' 

рдСрдлрд╕реЗрдЯ +00: 09 рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред Pytz рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 In : str(paris.localize(datetime(2017, 1, 1))) Out: '2017-01-01 00:00:00+01:00' 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐рд╕реА рднреА рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдмрджрд▓рддреЗ рдбреЗрдЯреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреАрдПрд╕рдЯреА рдЕрд╡рдзрд┐ рдХреА рд╕реАрдорд╛ рдкрд░) рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ datetime рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП normalize рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 In : new_time = time + timedelta(days=2) In : str(new_time) Out: '2018-03-27 00:00:00+01:00' In : str(paris.normalize(new_time)) Out: '2018-03-27 01:00:00+02:00' 

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╛рдпрдерди 3.6 рд╣реИ, рддреЛ рдкреНрд░рд▓реЗрдЦрди dateutil.tz рдмрдЬрд╛рдп dateutil.tz рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА pytz ред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ tzinfo рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ, рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ normalize рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдЪ рд╣реИ, рдпрд╣ рдЕрдзрд┐рдХ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ pytz API рдХрд╛ рд╕рдорд░реНрдерди рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝реЗрдВред

рдЬрд╛рджреВ рдХреА рд░реЛрдХ


next(x) рдмрд╛рд░ next(x) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рд╡рд╣ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ x рд╕реЗ рдПрдХ рдирдпрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ StopIteration , рддреЛ StopIteration рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рдЕрдм рдорд╛рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╢рд░реАрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ StopIteration рдлреЗрдВрдХ рджреЗрдЧрд╛:

 >>> def one_two(): ... yield 1 ... yield 2 ... >>> i = one_two() >>> next(i) 1 >>> next(i) 2 >>> next(i) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration 

StopIteration рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрди рдЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ next рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:

 >>> list(one_two()) [1, 2] 

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

 def one_two(): yield 1 yield 2 def one_two_repeat(n): for _ in range(n): i = one_two() yield next(i) yield next(i) yield next(i) print(list(one_two_repeat(3))) 

рдпрд╣рд╛рдВ, рдЕрдВрддрд┐рдо yield рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ: рдПрдХ рдлреЗрдВрдХ StopIteration рдЕрдкрд╡рд╛рдж list(...) рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдо [1, 2] ред рд╣рд╛рд▓рд╛рдБрдХрд┐, Python 3.7 рдореЗрдВ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рд╡рд┐рджреЗрд╢реА StopIteration рдЬрдЧрд╣ RuntimeError :

 Traceback (most recent call last): File "test.py", line 10, in one_two_repeat yield next(i) StopIteration The above exception was the direct cause of the following exception: Traceback (most recent call last): File "test.py", line 12, in <module> print(list(one_two_repeat(3))) RuntimeError: generator raised StopIteration 

рдкрд╛рдпрдерди 3.5 рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк __future__ import generator_stop рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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


All Articles