SlideShare a Scribd company logo
WebCamp 2016: Python.Максим Климишин.Типизированный Python
‣ 12+ лет опыта, 7 лет с Python, 6 с JS

‣ Работал в oDesk, Helios, 42cc.

‣ Соорганизатор PyCon Ukraine, KyivJS

‣ CTO в CartFresh
Обо мне
‣ Стартап по доставке продуктов на дом

‣ Работаем как CartFresh (Boston, US) и ZAKAZ.UA
(Киев, Днепр, Одесса, Харьков)

‣ Apache CouchDB, Apache Solr, Redis

‣ python back-end
CartFresh
Эта презентация не о
‣ автогенерации кода

‣ поиске серебряной пули

‣ проверке типов в рантайме

‣ статически типизированным питоне
WebCamp 2016: Python.Максим Климишин.Типизированный Python
‣ Немного зачем это надо

‣ Как это выглядит

‣ Тулы и как можно пользоваться на практике
Содержание
Теория типов
Пусть в некой деревне живёт брадобрей, который
бреет тех и только тех, которые не бреются сами.
Бреет ли брадобрей сам себя?
Парадокс Рассела
‣ В 1908 Russell & Whitehead доставили “"ramified" theory of types”
‣ В 1920-х Leon Chwistek and Frank P. Ramsey доставили "simple
type theory”
‣ 1940 Alonzo Church "A Formulation of the Simple Theory of Types”
‣ 1972 Girard–Reynolds discovered System F (polymorphic lambda
calculus)
История
‣ Пацаны обратили внимание, что у простой теории
типов есть интересные свойства и может быть
просто расширена до поддержки Декартового
произведения и дизъюнктного объединения

‣ Поэтому простую теорию типов используют в
дизайне языков программирования

‣ А System F помогла улучшила простую теорию типов
и такое полезное свойство, как полиморфизм
Теория
WebCamp 2016: Python.Максим Климишин.Типизированный Python
‣ Python will remain a dynamically typed language, and
the authors have no desire to ever make type hints
mandatory, even by convention
PEP 484
def f(x: str) -> str:
Gradual Typing
‣ Разработана в 2006 году Jeremy Siek и Walid Taha 

‣ Идея состоит в том, чтобы позволить части кода
быть динамически типизированным, а части –
 статически
Нафига
‣ Статическое описание типа аргументов и
возвращаемого значения функций упрощает чтение
кода и помогает формировать документацию

‣ Поможет обнаружить баги за меньшее количество
времени

‣ Поможет найти сложновоспроизводимые баги
быстрее
Напоминаю, чтение кода
‣ IBM 1989: 50% of the effort in accomplishing a task for the
programmer is towards understanding the system

‣ Bell Labs 1992: 60%-80% of their time understanding code,
20% as the developers gain experience with current
codebase

‣ National Research Council 1997 (Canada): over 25% of their
time either searching for or looking at code

‣ Peter Hallam 2006: 70% during personal experiment

‣ Microsoft 2007: 65% (survey)
Что было
‣ PyCharm умел делать статический анализ контекста
использования переменных. Мог трекать до 60%
случаев. Похоже на Facebook’s flow для JavaScript

‣ Prospector – смесь статического анализатора с PyLint

‣ In-house tools по анализу docstring etc.
Python
Определение в контексте Python:
Предполагается, что тип – это множество значений и
множество функций, к которым можно применить эти
значения.
Gradual Typing
‣ Тип t1 консистентен с типом t2 если t1 это подтип t2
(но не наоборот!)

‣ Any консистентен со всеми типами (но не является
подтипом)

‣ Все типы являются подтипом Any
Отношение между подтипами
‣ Каждый тип является подтипом самого себя

‣ Множество значений уменьшается с увеличением
количества функций, которые работают с этим
подтипом
Типы vs Классы
Классы являются фабриками объектов, определенных
с помощью class . Класс – динамическая/runtime
концепция
Аннотации
‣ Аннотации типов являются опциональными

‣ Никак не влияют на выполнение

‣ lambda-функции не поддерживают аннотации
Синтаксис
def f(x: int) -> int:
return x + 1
print(f(1))
def f1(x: int) -> int:
y = "1" # type: int
return x + y
print (f(2))
Python 2
def embezzle(account, funds=1000000, *fake_receipts):
# type: (str, int, *str) -> None
"""Embezzle funds from account using fake
receipts."""
return None
print embezzle(1, 1000)
# hints11.py, line 9: Argument 1 to "embezzle" has
incompatible type "int";
expected "str"
Граф анализа
from typing import List, Any
def append_pi(lst: List[float]) -> None:
lst += [3.14]
append_seven(lst)
def append_seven(lst):
lst.append("7")
my_list = [1, 3, 5] # type: List[float]
append_pi(my_list)
print (my_list)
# [1, 3, 5, 3.14, '7']
Numeric Tower
Number :> Complex :> Real :> Rational :> Integral
Граф анализа
from typing import List, Any
def append_pi(lst: List[float]) -> None:
lst += [3.14]
def append_seven(lst):
lst.append("7")
append_pi(lst)
my_list = [1, 3, 5] # type: List[float]
append_seven(my_list)
print (my_list)
# [1, 3, 5, '7', 3.14]
Какие бывают
‣ Встроенные классы (int, bool etc.)

‣ Абстрактные классы

‣ Дополнительно из модуля typing: None , Any , Union ,
Tuple , Callable, Sequence, Dict

‣ Динамически вычисленные типы не работают
Алиасы
from typing import TypeVar, Iterable, Tuple
Url = str
def fetch(url: Url):
pass
T = TypeVar('T', int, float, complex)
def inproduct(v: Iterable[Tuple[T, T]]) -> T:
return sum(x*y for x, y in v)
print(inproduct(((1, 1.3),)))
# 1.3
Дженерики
‣ TypeVar – фабрика для создания
параметризированных дженериков, напр. AnyStr =
TypeVar('AnyStr', str, bytes)
‣ def concat(x: AnyStr, y: AnyStr) -> AnyStr –
 ограничения на тип сразу на оба аргумента
Дженерики
from typing import TypeVar
AnyStr = TypeVar('AnyStr', str, bytes)
def concat(x: AnyStr, y: AnyStr) -> AnyStr:
return x + y
print(concat("_(*~", "*)_/"))
# _(*~*)_/
concat(b"_(*~", "*)_/")
# TypeError: string argument without an encoding
# hints4.py, line 17: Type argument 1 of "concat" has
incompatible value
"object"
Отношение между подтипами
from typing import List
class User(int):
pass
my_list = [1, 3, 5] # type: List[int]
my_list.append(User())
print(my_list)
# [1, 3, 5, 0]
my_list2 = [1] # type: List[User]
print (my_list2)
# hints2.py, line 14: List item 1 has incompatible
type "int"
Forward references
class Tree:
def __init__(self, left: Tree, right: Tree) -> None:
self.left = left
self.right = right
Это не будет работать
Forward references
class Tree:
def __init__(self, left: ‘Tree’, right: ‘Tree’) -> None:
self.left = left
self.right = right
Это не будет работать
Union
from typing import Union, Sequence
class Employee(str): pass
def employees(e: Union[Employee, Sequence[Employee]]) -> None:
if isinstance(e, Employee):
e = [e]
for _ in e:
print("Employee: {}".format(_))
employees(Employee("Max K"))
# Employee: Max K
employees([Employee("Max K"),
Employee("Dima Y")])
# Employee: Max K
# Employee: Dima Y
Any
Все типы являются подтипом Any
Проверка в Runtime
import typing
if typing.TYPE_CHECKING:
import expensive_mod
def a_func(arg: 'expensive_mod.SomeClass') -> None:
a_var = arg # type: expensive_mod.SomeClass
Переменные
x = [] # type: List[Employee]
x, y, z = [], [], [] # type: List[int], List[int], List[str]
x, y, z = [], [], [] # type: (List[int], List[int], List[str])
x = [
1,
2,
] # type: List[int]
Stub-files
‣ Расширения

‣ Third-party модули без типов

‣ Standard library модули

‣ Модули, которые должны поддерживать Python 2 и 3

‣ Модули, которые используют аннотации в другом
контексте
Игнор
‣ Декоратор @no_type_check для класса или функции

‣ # type: ignore
bright future ahead
Thanks.
@maxmaxmaxmax

More Related Content

PDF
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
PPTX
C++ Core Guidelines
ODP
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
PDF
Семь тысяч Rps, один go
PDF
Python и Cython
PPTX
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
PDF
REPL в Node.js: улучшаем быт разработчик
PPTX
Expert Java Day: Java concurrency
WebCamp2016:Front-End.Максим Климишин.Теоретические и практические концепции ...
C++ Core Guidelines
ekbpy'2012 - Марк Коренберг - Системное программирование на Питоне
Семь тысяч Rps, один go
Python и Cython
Оптимизация высоконагруженных ASP.NET приложений, работающих с MS SQL Server ...
REPL в Node.js: улучшаем быт разработчик
Expert Java Day: Java concurrency

What's hot (20)

PPT
Секреты сборки мусора в Java (Алексей Рагозин)
PDF
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
PDF
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
PDF
Павел Довгалюк, Обратная отладка
PPTX
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
PPTX
Александр Фокин, Рефлексия в C++
PDF
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
PDF
Для чего мы делали свой акторный фреймворк и что из этого вышло?
PPTX
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PPT
C# 5.0. Взгляд в будущее
PDF
Олег Бартунов и Иван Панченко
PDF
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
PDF
Профилирование кода на C/C++ в *nix системах
PDF
Common Lisp как второй язык
PDF
Python&Printer / Андрей Пучко / penta.by
PDF
Константин Осипов
PPTX
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
PDF
Akka: как я перестал бояться и полюбил асинхронный код
PDF
Борис Сазонов, RAII потоки и CancellationToken в C++
Секреты сборки мусора в Java (Алексей Рагозин)
"G1 GC и Обзор сборки мусора в HotSpot JVM" @ JUG SPb, 31-05-2012
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
Павел Довгалюк, Обратная отладка
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Александр Фокин, Рефлексия в C++
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
C# 5.0. Взгляд в будущее
Олег Бартунов и Иван Панченко
Язык Lua — секреты производительности / Ник Заварицкий (Mail.ru)
Профилирование кода на C/C++ в *nix системах
Common Lisp как второй язык
Python&Printer / Андрей Пучко / penta.by
Константин Осипов
Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Akka: как я перестал бояться и полюбил асинхронный код
Борис Сазонов, RAII потоки и CancellationToken в C++
Ad

Viewers also liked (20)

PDF
WebCamp2016:Front-End.Катерина Поршнева.Эволюция CSS: от темных времен до CSS...
PDF
WebCamp 2016: Python_Кирилл Перевозчиков _Рецепты приготовления uWSGI
PDF
WebCamp 2016: PHP. Дмитрий Науменко: Рецепты для Yii2.
PDF
WebCamp 2016.PHP.Боднарчук Михаил.BDD на практике с Codeception
PDF
WebCamp 2016: PHP.Сергей Яковлев.Phalcon 3
PDF
WebCamp 2016: Python.Павел Коломиец.Использование микросервисов при написании...
PPTX
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
PDF
JS Lab2017_Lightning Talks_Рекрутинг.js
PDF
JS Lab2017_Lightning Talks_React Perfomance
PDF
JS Lab2017_Lightning Talks_PostCSS - there is a plugin for that
PDF
Frontendlab: Cравнить Несравнимое - Юлия Пучнина
PDF
JS Lab2017_Алексей Заславский_React Fiber
PDF
JS Lab2017_Алексей Зеленюк_Сбалансированное окружение для вашей продуктивности
PDF
JS Lab2017_Юлия Пучнина_PhaserJS и что он умеет
PPTX
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
PPTX
JS Lab2017_Роман Якобчук_Почему так важно быть программистом в фронтенде
PDF
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
PDF
JS Lab2017_Андрей Кучеренко _Разработка мультипакетных приложения: причины, с...
PDF
JS Lab2017_Сергей Селецкий_System.js и jspm
PDF
WebCamp 2016: BizDev. Кейт Голдберг: Agile business development: как применят...
WebCamp2016:Front-End.Катерина Поршнева.Эволюция CSS: от темных времен до CSS...
WebCamp 2016: Python_Кирилл Перевозчиков _Рецепты приготовления uWSGI
WebCamp 2016: PHP. Дмитрий Науменко: Рецепты для Yii2.
WebCamp 2016.PHP.Боднарчук Михаил.BDD на практике с Codeception
WebCamp 2016: PHP.Сергей Яковлев.Phalcon 3
WebCamp 2016: Python.Павел Коломиец.Использование микросервисов при написании...
JS Lab2017_Под микроскопом: блеск и нищета микросервисов на node.js
JS Lab2017_Lightning Talks_Рекрутинг.js
JS Lab2017_Lightning Talks_React Perfomance
JS Lab2017_Lightning Talks_PostCSS - there is a plugin for that
Frontendlab: Cравнить Несравнимое - Юлия Пучнина
JS Lab2017_Алексей Заславский_React Fiber
JS Lab2017_Алексей Зеленюк_Сбалансированное окружение для вашей продуктивности
JS Lab2017_Юлия Пучнина_PhaserJS и что он умеет
JS Lab2017_Евгений Сафронов_Тестирование Javascript кода. Инструменты, практи...
JS Lab2017_Роман Якобчук_Почему так важно быть программистом в фронтенде
JS Lab2017_Виталий Лебедев_Практические сложности при разработке на node.js
JS Lab2017_Андрей Кучеренко _Разработка мультипакетных приложения: причины, с...
JS Lab2017_Сергей Селецкий_System.js и jspm
WebCamp 2016: BizDev. Кейт Голдберг: Agile business development: как применят...
Ad

Similar to WebCamp 2016: Python.Максим Климишин.Типизированный Python (20)

PDF
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
PPT
Rgsu04
PPT
Rgsu04
PDF
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
PDF
Мир Python функционалим с помощью библиотек
PDF
Большой брат помогает тебе
PDF
Back to the future: Функциональное программирование вчера и сегодня
PDF
Ф'Yii'лософия
PPTX
Статический и динамический полиморфизм в C++, Дмитрий Леванов
PPTX
Принципы работы статического анализатора кода PVS-Studio
PPTX
Функциональное программирование для разработки распределённых, облачных и веб...
PPTX
Николай Паламарчук "Functional Programming basics for PHP developers"
PPTX
Статический и динамический полиморфизм в C++, Дмитрий Леванов
PPTX
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
PPTX
Bytecode
ODP
Coroutines
PPTX
Универсальный сигнатурный анализ кода на C#, Java, PHP
PPTX
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
PDF
static - defcon russia 20
PDF
Павел Павлов - Scala для профессионалов - Joker 2013
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Rgsu04
Rgsu04
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
Мир Python функционалим с помощью библиотек
Большой брат помогает тебе
Back to the future: Функциональное программирование вчера и сегодня
Ф'Yii'лософия
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Принципы работы статического анализатора кода PVS-Studio
Функциональное программирование для разработки распределённых, облачных и веб...
Николай Паламарчук "Functional Programming basics for PHP developers"
Статический и динамический полиморфизм в C++, Дмитрий Леванов
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
Bytecode
Coroutines
Универсальный сигнатурный анализ кода на C#, Java, PHP
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
static - defcon russia 20
Павел Павлов - Scala для профессионалов - Joker 2013

More from WebCamp (20)

PDF
WebCamp 2016: PHP.Денис Потапов.Рефакторим код не задумываясь
PDF
WebCamp 2016: PHP.Алексей Петров.PHP at Scale: System Architect Toolbox
ODP
WebCamp2016:Front-End_Андрей Копёнкин_Оптимизируем мобильный веб полностью
PDF
WebCamp2016:Front-End_Юрий Артюх_Современные подходы в верстке
PDF
WebCamp2016:Front-End_Роман Якобчук_Relay, GraphQL и остальные радости соврем...
PDF
WebCamp2016:BizDev_Алексей Иваница_Как построить и монетизировать мобильный п...
PDF
WebCamp 2016: BizDev. Андрей Моспан: Правда ли, что продукт стоит ровно столь...
PDF
WebCamp 2016: BizDev. Марина Никитчук : Искусство продажи мечты, а не сервиса.
PDF
WebCamp 2016: BizDev. Александр Борняков: Маркетинг в США: как привлечь к себ...
PDF
WebCamp 2016: DevOps. Ярослав Погребняк: Gobetween - новый лоад балансер для ...
PDF
WebCamp 2016: DevOps. Николай Дойков: Опыт создания клауда для потокового вид...
PDF
WebCamp 2016: DevOps. Егор Лопатин и Юрий Железко: How we build and deploy ou...
PDF
WebCamp 2016: Front-end. Виталий Бобров: JavaScript для мобильной разработки.
PDF
WebCamp 2016: Front-end. Андрей Ситник: Stylelint — как и зачем линтить CSS
PDF
WebCamp 2016: PHP. Александр Шкарбалюк: SSO: Кому оно нужно и как его готовить?
PPTX
WebCamp 2016: PHP. Николай Паламарчук: PHP и микросервисы
PDF
WebCamp 2016: PM. Яна Пролис: "Вредные" советы по конфликтам в команде и комп...
PDF
WebCamp 2016: PM. Александр Демура: Откуда берутся тупые заказчики, и что с н...
PDF
WebCamp 2016: PM. Дмитрий Пискарев: Способы мотивации и продления LTV сотрудн...
PDF
WebCamp 2016: PM. Евгений Лабунский: Командная безответственность
WebCamp 2016: PHP.Денис Потапов.Рефакторим код не задумываясь
WebCamp 2016: PHP.Алексей Петров.PHP at Scale: System Architect Toolbox
WebCamp2016:Front-End_Андрей Копёнкин_Оптимизируем мобильный веб полностью
WebCamp2016:Front-End_Юрий Артюх_Современные подходы в верстке
WebCamp2016:Front-End_Роман Якобчук_Relay, GraphQL и остальные радости соврем...
WebCamp2016:BizDev_Алексей Иваница_Как построить и монетизировать мобильный п...
WebCamp 2016: BizDev. Андрей Моспан: Правда ли, что продукт стоит ровно столь...
WebCamp 2016: BizDev. Марина Никитчук : Искусство продажи мечты, а не сервиса.
WebCamp 2016: BizDev. Александр Борняков: Маркетинг в США: как привлечь к себ...
WebCamp 2016: DevOps. Ярослав Погребняк: Gobetween - новый лоад балансер для ...
WebCamp 2016: DevOps. Николай Дойков: Опыт создания клауда для потокового вид...
WebCamp 2016: DevOps. Егор Лопатин и Юрий Железко: How we build and deploy ou...
WebCamp 2016: Front-end. Виталий Бобров: JavaScript для мобильной разработки.
WebCamp 2016: Front-end. Андрей Ситник: Stylelint — как и зачем линтить CSS
WebCamp 2016: PHP. Александр Шкарбалюк: SSO: Кому оно нужно и как его готовить?
WebCamp 2016: PHP. Николай Паламарчук: PHP и микросервисы
WebCamp 2016: PM. Яна Пролис: "Вредные" советы по конфликтам в команде и комп...
WebCamp 2016: PM. Александр Демура: Откуда берутся тупые заказчики, и что с н...
WebCamp 2016: PM. Дмитрий Пискарев: Способы мотивации и продления LTV сотрудн...
WebCamp 2016: PM. Евгений Лабунский: Командная безответственность

WebCamp 2016: Python.Максим Климишин.Типизированный Python

  • 2. ‣ 12+ лет опыта, 7 лет с Python, 6 с JS ‣ Работал в oDesk, Helios, 42cc. ‣ Соорганизатор PyCon Ukraine, KyivJS ‣ CTO в CartFresh Обо мне
  • 3. ‣ Стартап по доставке продуктов на дом ‣ Работаем как CartFresh (Boston, US) и ZAKAZ.UA (Киев, Днепр, Одесса, Харьков) ‣ Apache CouchDB, Apache Solr, Redis ‣ python back-end CartFresh
  • 4. Эта презентация не о ‣ автогенерации кода ‣ поиске серебряной пули ‣ проверке типов в рантайме ‣ статически типизированным питоне
  • 6. ‣ Немного зачем это надо ‣ Как это выглядит ‣ Тулы и как можно пользоваться на практике Содержание
  • 8. Пусть в некой деревне живёт брадобрей, который бреет тех и только тех, которые не бреются сами. Бреет ли брадобрей сам себя? Парадокс Рассела
  • 9. ‣ В 1908 Russell & Whitehead доставили “"ramified" theory of types” ‣ В 1920-х Leon Chwistek and Frank P. Ramsey доставили "simple type theory” ‣ 1940 Alonzo Church "A Formulation of the Simple Theory of Types” ‣ 1972 Girard–Reynolds discovered System F (polymorphic lambda calculus) История
  • 10. ‣ Пацаны обратили внимание, что у простой теории типов есть интересные свойства и может быть просто расширена до поддержки Декартового произведения и дизъюнктного объединения ‣ Поэтому простую теорию типов используют в дизайне языков программирования ‣ А System F помогла улучшила простую теорию типов и такое полезное свойство, как полиморфизм Теория
  • 12. ‣ Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention PEP 484 def f(x: str) -> str:
  • 13. Gradual Typing ‣ Разработана в 2006 году Jeremy Siek и Walid Taha ‣ Идея состоит в том, чтобы позволить части кода быть динамически типизированным, а части –  статически
  • 14. Нафига ‣ Статическое описание типа аргументов и возвращаемого значения функций упрощает чтение кода и помогает формировать документацию ‣ Поможет обнаружить баги за меньшее количество времени ‣ Поможет найти сложновоспроизводимые баги быстрее
  • 15. Напоминаю, чтение кода ‣ IBM 1989: 50% of the effort in accomplishing a task for the programmer is towards understanding the system ‣ Bell Labs 1992: 60%-80% of their time understanding code, 20% as the developers gain experience with current codebase ‣ National Research Council 1997 (Canada): over 25% of their time either searching for or looking at code ‣ Peter Hallam 2006: 70% during personal experiment ‣ Microsoft 2007: 65% (survey)
  • 16. Что было ‣ PyCharm умел делать статический анализ контекста использования переменных. Мог трекать до 60% случаев. Похоже на Facebook’s flow для JavaScript ‣ Prospector – смесь статического анализатора с PyLint ‣ In-house tools по анализу docstring etc.
  • 18. Определение в контексте Python: Предполагается, что тип – это множество значений и множество функций, к которым можно применить эти значения.
  • 19. Gradual Typing ‣ Тип t1 консистентен с типом t2 если t1 это подтип t2 (но не наоборот!) ‣ Any консистентен со всеми типами (но не является подтипом) ‣ Все типы являются подтипом Any
  • 20. Отношение между подтипами ‣ Каждый тип является подтипом самого себя ‣ Множество значений уменьшается с увеличением количества функций, которые работают с этим подтипом
  • 21. Типы vs Классы Классы являются фабриками объектов, определенных с помощью class . Класс – динамическая/runtime концепция
  • 22. Аннотации ‣ Аннотации типов являются опциональными ‣ Никак не влияют на выполнение ‣ lambda-функции не поддерживают аннотации
  • 23. Синтаксис def f(x: int) -> int: return x + 1 print(f(1)) def f1(x: int) -> int: y = "1" # type: int return x + y print (f(2))
  • 24. Python 2 def embezzle(account, funds=1000000, *fake_receipts): # type: (str, int, *str) -> None """Embezzle funds from account using fake receipts.""" return None print embezzle(1, 1000) # hints11.py, line 9: Argument 1 to "embezzle" has incompatible type "int"; expected "str"
  • 25. Граф анализа from typing import List, Any def append_pi(lst: List[float]) -> None: lst += [3.14] append_seven(lst) def append_seven(lst): lst.append("7") my_list = [1, 3, 5] # type: List[float] append_pi(my_list) print (my_list) # [1, 3, 5, 3.14, '7']
  • 26. Numeric Tower Number :> Complex :> Real :> Rational :> Integral
  • 27. Граф анализа from typing import List, Any def append_pi(lst: List[float]) -> None: lst += [3.14] def append_seven(lst): lst.append("7") append_pi(lst) my_list = [1, 3, 5] # type: List[float] append_seven(my_list) print (my_list) # [1, 3, 5, '7', 3.14]
  • 28. Какие бывают ‣ Встроенные классы (int, bool etc.) ‣ Абстрактные классы ‣ Дополнительно из модуля typing: None , Any , Union , Tuple , Callable, Sequence, Dict ‣ Динамически вычисленные типы не работают
  • 29. Алиасы from typing import TypeVar, Iterable, Tuple Url = str def fetch(url: Url): pass T = TypeVar('T', int, float, complex) def inproduct(v: Iterable[Tuple[T, T]]) -> T: return sum(x*y for x, y in v) print(inproduct(((1, 1.3),))) # 1.3
  • 30. Дженерики ‣ TypeVar – фабрика для создания параметризированных дженериков, напр. AnyStr = TypeVar('AnyStr', str, bytes) ‣ def concat(x: AnyStr, y: AnyStr) -> AnyStr –  ограничения на тип сразу на оба аргумента
  • 31. Дженерики from typing import TypeVar AnyStr = TypeVar('AnyStr', str, bytes) def concat(x: AnyStr, y: AnyStr) -> AnyStr: return x + y print(concat("_(*~", "*)_/")) # _(*~*)_/ concat(b"_(*~", "*)_/") # TypeError: string argument without an encoding # hints4.py, line 17: Type argument 1 of "concat" has incompatible value "object"
  • 32. Отношение между подтипами from typing import List class User(int): pass my_list = [1, 3, 5] # type: List[int] my_list.append(User()) print(my_list) # [1, 3, 5, 0] my_list2 = [1] # type: List[User] print (my_list2) # hints2.py, line 14: List item 1 has incompatible type "int"
  • 33. Forward references class Tree: def __init__(self, left: Tree, right: Tree) -> None: self.left = left self.right = right Это не будет работать
  • 34. Forward references class Tree: def __init__(self, left: ‘Tree’, right: ‘Tree’) -> None: self.left = left self.right = right Это не будет работать
  • 35. Union from typing import Union, Sequence class Employee(str): pass def employees(e: Union[Employee, Sequence[Employee]]) -> None: if isinstance(e, Employee): e = [e] for _ in e: print("Employee: {}".format(_)) employees(Employee("Max K")) # Employee: Max K employees([Employee("Max K"), Employee("Dima Y")]) # Employee: Max K # Employee: Dima Y
  • 36. Any Все типы являются подтипом Any
  • 37. Проверка в Runtime import typing if typing.TYPE_CHECKING: import expensive_mod def a_func(arg: 'expensive_mod.SomeClass') -> None: a_var = arg # type: expensive_mod.SomeClass
  • 38. Переменные x = [] # type: List[Employee] x, y, z = [], [], [] # type: List[int], List[int], List[str] x, y, z = [], [], [] # type: (List[int], List[int], List[str]) x = [ 1, 2, ] # type: List[int]
  • 39. Stub-files ‣ Расширения ‣ Third-party модули без типов ‣ Standard library модули ‣ Модули, которые должны поддерживать Python 2 и 3 ‣ Модули, которые используют аннотации в другом контексте
  • 40. Игнор ‣ Декоратор @no_type_check для класса или функции ‣ # type: ignore