рдкрд╛рдпрдерди v3.x: рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдПрд╕рдПрдордПрд╕ рдХреЗ рдмрд┐рдирд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдЧрддрд┐ рдХреИрд╕реЗ рдмрдврд╝рд╛рдПрдВ

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

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

рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рдЕрдЯрдХрд▓реЗрдВ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рдЕрдбрд╝рдЪрдиреЗрдВ рдереАрдВред

рд▓рдЧрд╛рддрд╛рд░ рдЕрдЧрд░:
if isinstance(self.custom_handlers, property): if self.custom_handlers and e.__class__ in self.custom_handlers: if e.__class__ not in self.exclude: 


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

рдПрдХ рдЕрд▓рдЧ рдмрд┐рдВрджреБ рдЕрдЧрд░ рдЕрдВрджрд░ рд╣реИред рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдХреЙрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдбрд┐рдХреНрдЯреЗрдЯ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЗрдл рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп:
 self.handlers.get(e.__class__, Exception)(e) 


рдЗрд╕рд▓рд┐рдП рд╕реЗрд▓реНрдлрд╣реИрдВрдбрд▓рд░реНрд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рддрд╛рдирд╛рд╢рд╛рд╣реА рд╣реИ, рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЕрдиреНрдп рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЙрдард╛рддрд╛ рд╣реИред

рдмреЗрд╢рдХ, рдЖрд╡рд░рдг рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдпрд╣ рд╡рд╣реА рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рд╣рд░ рдмрд╛рд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА рдпрд╣рд╛рдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрд╛рдВрдЪреЛрдВ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдХрд▓реЛрдб рд╕реЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЙрдиреНрд╣реЗрдВ __init__ рдпрд╛ __call__ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЖрд╡рд░рдг рдкрд╣рд▓реЗ рдерд╛:
 def wrapper(self, *args, **kwargs): if self.custom_handlers: if isinstance(self.custom_handlers, property): self.custom_handlers = self.custom_handlers.__get__(self, self.__class__) if asyncio.iscoroutinefunction(self.func): return self._coroutine_exception_handler(*args, **kwargs) else: return self._sync_exception_handler(*args, **kwargs) 


рдЪреЗрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЫрдд рд╕реЗ рд╣реЛрдХрд░ рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╕рднреА рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╣рд░ рдХреЙрд▓ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рд░реИрдкрд░ рдЗрд╕ рддрд░рд╣ рдмрдиреЗ:
  def __call__(self, func): self.func = func if iscoroutinefunction(self.func): def wrapper(*args, **kwargs): return self._coroutine_exception_handler(*args, **kwargs) else: def wrapper(*args, **kwargs): return self._sync_exception_handler(*args, **kwargs) return wrapper 


рдпрд╛рдж рд░рдЦреЗрдВ, __call__ рдХреЛ рдПрдХ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред __Call__ рдХреЗ рдЕрдВрджрд░, рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХрддрд╛ рдХреА рдбрд┐рдЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рдпрд╛ рдХреЛрд░рдЯрд╛рдЗрди рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ asyncio.iscoroutinefunction рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ред рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, asyncio рдФрд░ рдирд┐рд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдмреЗрдВрдЪ (cProfile):

  ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 coroutines.py:160(iscoroutinefunction) 1 0.000 0.000 0.000 0.000 inspect.py:158(isfunction) 1 0.000 0.000 0.000 0.000 inspect.py:179(iscoroutinefunction) 1 0.000 0.000 0.000 0.000 {built-in method builtins.exec} 1 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 


  ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.000 0.000 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 inspect.py:158(isfunction) 1 0.000 0.000 0.000 0.000 inspect.py:179(iscoroutinefunction) 1 0.000 0.000 0.000 0.000 {built-in method builtins.exec} 1 0.000 0.000 0.000 0.000 {built-in method builtins.isinstance} 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 


рдкреВрд░реНрдг рдХреЛрдб:
 from inspect import iscoroutinefunction from asyncio import QueueEmpty, QueueFull from concurrent.futures import TimeoutError class ProcessException(object): __slots__ = ('func', 'handlers') def __init__(self, custom_handlers=None): self.func = None if isinstance(custom_handlers, property): custom_handlers = custom_handlers.__get__(self, self.__class__) def raise_exception(e: Exception): raise e exclude = { QueueEmpty: lambda e: None, QueueFull: lambda e: None, TimeoutError: lambda e: None } self.handlers = { **exclude, **(custom_handlers or {}), Exception: raise_exception } def __call__(self, func): self.func = func if iscoroutinefunction(self.func): def wrapper(*args, **kwargs): return self._coroutine_exception_handler(*args, **kwargs) else: def wrapper(*args, **kwargs): return self._sync_exception_handler(*args, **kwargs) return wrapper async def _coroutine_exception_handler(self, *args, **kwargs): try: return await self.func(*args, **kwargs) except Exception as e: return self.handlers.get(e.__class__, Exception)(e) def _sync_exception_handler(self, *args, **kwargs): try: return self.func(*args, **kwargs) except Exception as e: return self.handlers.get(e.__class__, Exception)(e) 


рдФрд░ рд╢рд╛рдпрдж рдЙрджрд╛рд╣рд░рдг рд╕рдордп рдХреЗ рдмрд┐рдирд╛ рдЕрдзреВрд░рд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:
 class MathWithTry(object): def divide(self, a, b): try: return a // b except ZeroDivisionError: return '   ,   ' 


рдФрд░ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдкрд╛рда рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг ( рдзреНрдпрд╛рди! рд╣рдо рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдкрд╛рда рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдИ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдерд╛ рдФрд░ рдХреЗрд╡рд▓ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛)ред
 class Math(object): @property def exception_handlers(self): return { ZeroDivisionError: lambda e: '   ,   ' } @ProcessException(exception_handlers) def divide(self, a, b): return a // b 


рдпрд╣рд╛рдБ рдЖрдк рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:
 timeit.timeit('math_with_try.divide(1, 0)', number=100000, setup='from __main__ import math_with_try') 0.05079065300014918 timeit.timeit('math_with_decorator.divide(1, 0)', number=100000, setup='from __main__ import math_with_decorator') 0.16211646200099494 


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

рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдкрд░ рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реВрдВ :)

PS рд╣реИрдмрд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рднреА рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдерд╛, рдпрд╣реА рд╣реБрдЖ рд╣реИ:
 from inspect import iscoroutinefunction from asyncio import QueueEmpty, QueueFull from concurrent.futures import TimeoutError class ProcessException(object): __slots__ = ('handlers',) def __init__(self, custom_handlers=None): if isinstance(custom_handlers, property): custom_handlers = custom_handlers.__get__(self, self.__class__) raise_exception = ProcessException.raise_exception exclude = { QueueEmpty: lambda e: None, QueueFull: lambda e: None, TimeoutError: lambda e: None } self.handlers = { **exclude, **(custom_handlers or {}), Exception: raise_exception } def __call__(self, func): handlers = self.handlers if iscoroutinefunction(func): async def wrapper(*args, **kwargs): try: return await func(*args, **kwargs) except Exception as e: return handlers.get(e.__class__, handlers[Exception])(e) else: def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception as e: return handlers.get(e.__class__, handlers[Exception])(e) return wrapper @staticmethod def raise_exception(e: Exception): raise e 


 timeit.timeit('divide(1, 0)', number=100000, setup='from __main__ import divide') 0.13714907199755544 


рдФрд╕рддрди 0.03 рджреНрд╡рд╛рд░рд╛ рддреНрд╡рд░рд┐рддред Kostiantyn рдФрд░ Yngvie рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

рдкреБрдирд╢реНрдЪ рдЕрджреНрдпрддрди! рдореИрдВрдиреЗ рдЖрдЧреЗ рднреА onegreyonewhite рдФрд░ resetme рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдмрд╕ рдХрд╡рдХ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рдПрдХ рдЪрд░ рдореЗрдВ рд╕реНрд╡.рд╣реИрдВрдбрд▓рд░ рдмрдирд╛ рджрд┐рдпрд╛ред рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдФрд░ рддреЗрдЬреА рд▓рд╛рдИ рдЧрдИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдЕрдЧрд░ рдкреНрд░рддрд┐ рд╢реВрдиреНрдп рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реЛред рдореИрдВ рдмреЛрд▓реА рд╕рдордп:
 timeit.timeit('t.divide_with_decorator(1, 0)', number=1000000, setup='from __main__ import t') 1.1116105649998644 


рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рд╕реЗ рдкрд╣рд▓реЗ, рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдорд╛рди рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрди рдиреЗ рдФрд╕рддрди 1.24 рд▓рд┐рдпрд╛ред

PS рдореИрдВрдиреЗ @staticmethod рдореЗрдВ __init__ рд╕реЗ raise_exception рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рдХреЗ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдПрдХ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рджрд░рдЕрд╕рд▓, рдФрд╕рдд рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдмрди рдЧрдпрд╛ рд╣реИ:
 timeit.timeit('t.divide_with_decorator(1, 0)', number=1000000, setup='from __main__ import t') 1.0691639049982768 


рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╣реИред рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдФрд░ рднреА рддреЗрдЬ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд╕рддрди):
 timeit.timeit('div(1, 0)', number=1000000, setup='from __main__ import div') 1.0463485610016505 

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


All Articles