Различия между версиями 5 и 6
Версия 5 от 2022-12-03 11:55:40
Размер: 2678
Редактор: FrBrGeorge
Комментарий:
Версия 6 от 2022-12-03 19:35:42
Размер: 2807
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 6: Строка 6:
  * Будем считать что тип ''самой аннотации'' при этом всегда `types.GenericAlias`

Написать метакласс init, который рассчитывает на то, что методы создаваемого им класса полностью аннотированы. Для каждого позиционного параметра обычного метода в этом классе предусматривается значение по умолчанию (если оно не было задано) на основании типа в аннотации.

  • Если в аннотации тип параметра простой, значение по умолчанию — это тип_пареметра()

  • Если в аннотации тип параметра составной (тип_контейнера[ещё типы], например, list[int]), значение по умолчанию — это тип_контейнера()

    • Будем считать что тип самой аннотации при этом всегда types.GenericAlias

  • Если объект соответствующего типа нельзя создать конструктором без операндов, значение по умолчанию — None

   1 class C(metaclass=init):
   2     def __init__(self, var: int, rng: range, lst: list[int], defined: str = "defined"):
   3         self.data = f"{var}/{rng}/{lst}/{defined}"
   4 
   5 for c in (C(), C(1, range(3)), C(rng=range(4, 7)), C(lst=[1, 2, 3], defined=3)):
   6     print(c.data)

0/None/[]/defined
1/range(0, 3)/[]/defined
0/range(4, 7)/[]/defined
0/None/[1, 2, 3]/3

Спойлер:


CategoryHomework

LecturesCMC/PythonIntro2022/Homework_InitParam (последним исправлял пользователь FrBrGeorge 2022-12-03 19:35:42)