Advertisement
CosmicFox33

typedecorator

Dec 29th, 2022
660
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.72 KB | None | 0 0
  1. import typing
  2. from typing import List
  3. import inspect
  4.  
  5. def check_types(func):
  6.     def _wrapper(*args, **kwargs):
  7.         sig = inspect.signature(func)
  8.         hint_types = []
  9.         for arg, arg_type in func.__annotations__.items():
  10.             if typing.get_args(arg_type): #если у аргумента есть свои аргументы (типа int у List[int]), то надо получить основной тип
  11.                 hint_types.append(typing.get_origin(arg_type))
  12.             else:
  13.                 hint_types.append(arg_type)
  14.         positional_arg_types = [type(arg) for arg in args] #типы позиционных аргументов
  15.         for i in range(len(args)):
  16.             if positional_arg_types[i] != hint_types[i]:
  17.                 raise ValueError('Несоответствие типов позиционного аргумента')
  18.        
  19.         for arg_name, arg_value in kwargs.items():
  20.             arg_hint = func.__annotations__[arg_name]
  21.             arg_type = typing.get_origin(arg_hint) if typing.get_args(arg_hint) else arg_hint
  22.             if arg_type != type(arg_value):
  23.                 raise ValueError(f'Несоответствие типов ключевого аргумента "{arg_name}"')
  24.  
  25.         return_hint = func.__annotations__['return']
  26.         return_type = typing.get_origin(return_hint) if typing.get_args(return_hint) else return_hint
  27.         if return_type != type(func(*args, **kwargs)):
  28.             raise ValueError('Несоответствие типов возвращаемого результата')
  29.     return _wrapper
  30.  
  31. @check_types
  32. def func(a: int, b: str) -> str:
  33.     return a * b
  34.  
  35. func(5, 'a')
  36. func(b='a', a=5)
  37. func(5, b=['a','b'])
  38.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement