SlideShare a Scribd company logo
‣ 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
Эта презентация не о
‣ автогенерации кода

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

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

‣ статически типизированным питоне
‣ Немного зачем это надо

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

‣ Тулы и как можно пользоваться на практике
Содержание
Теория типов
Пусть в некой деревне живёт брадобрей, который
бреет тех и только тех, которые не бреются сами.
Бреет ли брадобрей сам себя?
Парадокс Рассела
‣ В 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 помогла улучшила простую теорию типов
и такое полезное свойство, как полиморфизм
Теория
‣ 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

What's hot

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

What's hot (20)

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

Viewers also liked

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

Viewers also liked (20)

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

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

Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Yandex
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
Mail.ru Group
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
PyNSK
 
Большой брат помогает тебе
Большой брат помогает тебеБольшой брат помогает тебе
Большой брат помогает тебе
Tatyanazaxarova
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
Alexander Granin
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
Paul Klimov
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Dmitri Soshnikov
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
Fwdays
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
Pavel Tsukanov
 
Coroutines
CoroutinesCoroutines
Coroutines
Aleksandr Mokrov
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
Иван Кочуркин
 
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Производительность Unity3D: подводные камни / Алексей Чубарь (BIT.GAMES)
Ontico
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
DefconRussia
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 

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

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

More from WebCamp

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

More from WebCamp (20)

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

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

  • 1.
  • 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. Эта презентация не о ‣ автогенерации кода ‣ поиске серебряной пули ‣ проверке типов в рантайме ‣ статически типизированным питоне
  • 5.
  • 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 помогла улучшила простую теорию типов и такое полезное свойство, как полиморфизм Теория
  • 11.
  • 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