Метаклассы и аннотации

Это две совсем разные темы, если что).

Метаклассы

Хороший пример real-life кода на Python, эксплуатирующий метаклассы и многое другое:

Итак.

Подробности:

Два примера:

Аннотации

Duck typing:

Однако:

Поэтому нужны указания о типе полей классов, параметрах и возвращаемых значений функций/методов и т. п. — Аннотации

Составные и нечёткие типы

Python 3.9 с нами :)

Просто прочитаем What’s New In Python 3.9

Модуль typing

Отложенная аннотация: pep-0563

Важно: в Python есть поддержка аннотаций, но практически нет их использования (разве что в dataclasses). В язык не входит, делайте сами.

MyPy

Зачем аннотации?

http://www.mypy-lang.org: статическая типизация в Python (ну, почти… или совсем!)

Пример для mypyc

   1 import time
   2 from typing import Tuple
   3 
   4 def fb(x:int,y:int)->Tuple[int,int]:
   5     return y,x+y
   6 
   7 def test()->float:
   8     x:int=0
   9     y:int=1
  10     t:float=time.time()
  11     for i in range(1000000):
  12         x = 0
  13         y = 1
  14         for j in range(100):
  15             x,y=fb(x,y)
  16     return time.time()-t

Сравнение производительности:

   1 $ mypyc speed.py
   2 running build_ext
   3 building 'speed' extension
   4 creating build/temp.linux-x86_64-3.8
   5 creating build/temp.linux-x86_64-3.8/build
   6 x86_64-alt-linux-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -pipe -frecord-gcc-switches -Wall -g -O3 -fPIC -I/home/george/.local/lib/python3/site-packages/mypyc/lib-rt -I/usr/include/python3.8 -c build/__native.c -o build/temp.linux-x86_64-3.8/build/__native.o -O3 -Werror -Wno-unused-function -Wno-unused-label -Wno-unreachable-code -Wno-unused-variable -Wno-unused-command-line-argument -Wno-unknown-warning-option -Wno-unused-but-set-variable
   7 x86_64-alt-linux-gcc -pthread -shared build/temp.linux-x86_64-3.8/build/__native.o -L/usr/lib64 -o /home/george/src/mypyex/speed.cpython-38.so
   8 $ ls
   9 build  ex1.py  __pycache__  speed.cpython-38.so  speed_.py
  10 $ mv speed.py speed_.py
  11 $ python3 -c "import speed_; print(speed_.test())"
  12 12.719617366790771
  13 $ python3 -c "import speed; print(speed.test())"
  14 2.643144130706787
  15 

Д/З

TODO