рдореЗрд░реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдЪреИрдирд▓ @pythonetc рд╕реЗ рдЯрд┐рдкреНрд╕ рдФрд░ рдЯреНрд░рд┐рдХ, рд╕рд┐рддрдВрдмрд░ 2019



рдпрд╣ рдореЗрд░реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдЪреИрдирд▓ @pythonetc рд╕реЗ рдкрд╛рдпрдерди рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдФрд░ рдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдПрдХ рдирдпрд╛ рдЪрдпрди рд╣реИред

Ations рдкрд┐рдЫрд▓рд╛ рдкреНрд░рдХрд╛рд╢рди


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

 import asyncio async def printer(): try: try: while True: print('*') await asyncio.sleep(1) except asyncio.CancelledError: print('x') finally: await asyncio.sleep(2) print('o') # never happens loop = asyncio.get_event_loop() run = loop.run_until_complete task = loop.create_task(printer()) run(asyncio.sleep(1)) # printer works here print('||') run(asyncio.sleep(1)) # printer works here task.cancel() # nothing happens run(asyncio.sleep(1)) # x printed 

рдЖрдЙрдЯрдкреБрдЯ:

 * * || * x 

рд▓реВрдк рдХреЛ рд░реЛрдХрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдмреНрд▓реЙрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


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

 from collections import deque from math import sqrt class Compose: def __init__(self): self._functions = deque() def __call__(self, *args, **kwargs): result = None for f in self._functions: result = f(*args, **kwargs) args = [result] kwargs = dict() return result def __rshift__(self, f): self._functions.append(f) return self def __lshift__(self, f): self._functions.appendleft(f) return self compose = Compose sqrt_abs = (compose() << sqrt << abs) sqrt_abs2 = (compose() >> abs >> sqrt) print(sqrt_abs(-4)) # 2.0 print(sqrt_abs2(-4)) # 2.0 


рдЖрдк рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдХрд╕реНрдЯрдо рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред class рд╕рдВрдХреЗрддрди рд╕рдорд░реНрдерди рдЦреЛрдЬрд╢рдмреНрдж рддрд░реНрдХ: class Klass(Parent, arg='arg') ред metaclass рдХреАрд╡рд░реНрдб metaclass рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред

рдпрд╣рд╛рдВ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИред remove рддрд░реНрдХ рдореЗрдВ рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 class FilterMeta(type): def __new__(mcs, name, bases, namespace, remove=None, **kwargs): if remove is not None and remove in namespace: del namespace[remove] return super().__new__(mcs, name, bases, namespace) class A(metaclass=FilterMeta, remove='half'): def half(x): return x // 2 half_of_4 = half(4) half_of_100 = half(100) a = A() print(a.half_of_4) # 2 print(a.half_of_100) # 50 a.half # AttributeError 


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

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рддрд░реАрдХрд╛ list(gen()) ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХреЛрдб рдореЗрдореЛрд░реА рдореЗрдВ рд╕рднреА рдорд╛рдиреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рд╡рд╣ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЗрд╕рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕реАрдорд┐рдд рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде deque рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 from collections import deque def inversed(nums): for num in nums: yield 1 / num try: deque(inversed([1, 2, 0]), maxlen=0) except ZeroDivisionError: print('E')</code> To be more semantically precise you better define your own <code>exhaust</code> function: <source lang="python"> def exhaust(iterable): for _ in iterable: pass 


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

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк Sequence рдХреЗ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рд╣реА Sequence рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдЙрдЪрд┐рдд рд╢рдмреНрдж рд╣реИ Sequence рдЕрдкрдиреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╣реИред

рдЖрдк рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 from typing import TypeVar, Generic T = TypeVar('T', covariant=True) class Holder(Generic[T]): def __init__(self, var: T): self._var: T = var def get(self) -> T: return self._var class User: pass class Admin(User): pass def print_user_from_holder(holder: Holder[User]) -> None: print(holder.get()) h: Holder[Admin] = Holder(Admin()) print_user_from_holder(h) 

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

 from typing import TypeVar, Generic T = TypeVar('T', contravariant=True) class Holder(Generic[T]): def __init__(self, var: T): self._var: T = var def change(self, x: T): self._var = x class User: pass class Admin(User): pass def place_admin_to_holder(holder: Holder[Admin]) -> None: holder.change(Admin()) h: Holder[User] = Holder(User()) place_admin_to_holder(h) 

рд╡реЗ рд╡рд░реНрдЧ рдЬреЛ рди рддреЛ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рди рд╣реА рдХрдВрдЯреНрд░рд╛рд╡рд┐рд░реЗрдВрдЯ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред

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


All Articles