Различия между версиями 2 и 3
Версия 2 от 2020-11-22 15:53:53
Размер: 2921
Редактор: FrBrGeorge
Комментарий:
Версия 3 от 2020-11-22 19:48:50
Размер: 3034
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 5: Строка 5:
  * "`Type of argument 'Имя' is not Тип`", если не совпадает тип именного параметра функции и соответствующий ему тип в `последовательности_типов`. Типы именованных параметров перечислены в конце `последовательности_типов` в порядке их описания в `def …`   * "`Type of argument 'Имя' is not Тип`", если не совпадает тип именного параметра функции и соответствующий ему тип в `последовательности_типов`.
   *
Типы именованных параметров перечислены в конце `последовательности_типов`
   * Типы именованных параметров проверяются
в порядке их появления при вызове функции

Написать параметрический декоратор TypeCheck(последовательность_типов, тип_результата), который бросает исключение TypeError при вызове функции со следующим сообщением:

  • "Type of argument Номер is not Тип", если не совпадает тип позиционного параметра функции и соответствующий ему по порядку тип в последовательности_типов

  • "Type of argument 'Имя' is not Тип", если не совпадает тип именного параметра функции и соответствующий ему тип в последовательности_типов.

    • Типы именованных параметров перечислены в конце последовательности_типов

    • Типы именованных параметров проверяются в порядке их появления при вызове функции
  • "Type of result is not Тип", если тип возвращённого функцией значения не совпадает с типом_результата

  • "Function функция must have число arguments" — если количество переданных функции параметров (включая переданные по умолчанию) не соответствует длине последовательности_типов

  • Сначала проверяются параметры в порядке описания в функции, затем вызывается функция, после чего проеряется результат. Ислкючение возникает при первом несовпадении типа.
       1 @TypeCheck((int, str, int), int)
       2 def valid(a, b, c=0):
       3     return len(b*(a+1))+c
       4 
       5 print(valid(3, "--", 10))
       6 try:
       7     valid(3, 7, 10)
       8 except TypeError as E:
       9     print(E)
    

18
Type of argument 2 is not <class 'str'>

Еще примеры:

   1 @TypeCheck([int, int], int)
   2 def semivalid(a, b):
   3     return a/b if a%2 else a*b
   4 
   5 @TypeCheck((int for i in range(4)), int)
   6 def variable(*args, **kwargs):
   7     return len(args)+len(kwargs)

   1 >>> valid(3, "--", 10)
   2 18
   3 >>> valid(3, 7, 10)
   4 
   5 TypeError: Type of argument 2 is not <class 'str'>
   6 >>> valid(3, "--", "*")
   7 
   8 TypeError: Type of argument 3 is not <class 'int'>
   9 >>> valid(3, "--", c=1.23)
  10 
  11 TypeError: Type of argument 'c' is not <class 'int'>
  12 >>> semivalid(2, 2)
  13 4
  14 >>> semivalid(1, 2)
  15 
  16 TypeError: Type of result is not <class 'int'>
  17 >>> variable(1,2,3,4)
  18 4
  19 >>> variable(1,2,a=100, b=500)
  20 4
  21 >>> variable(1,2,a=100)
  22 
  23 TypeError: Function variable must have 4 arguments
  24 


CategoryHomework

LecturesCMC/PythonIntro2020/Homework_TypeCheck (последним исправлял пользователь FrBrGeorge 2020-11-22 19:48:50)