Slide 1

Slide 1 text

1 0 0 % o p c i o n a l TYPE HINTS: PEGA LEVE Indrodução, vantagens e desvantagens do
 sistema de tipos gradual de Python Luciano Ramalho @ramalhoorg

Slide 2

Slide 2 text

2 https://twitter.com/raymondh/status/1255580152706158592

Slide 3

Slide 3 text

TYPE HINTS? Breve introdução 3

Slide 4

Slide 4 text

DECLARAÇÕES DE TIPO ESTATÁTICAS Formalizadas na PEP 484 — Type Hints (e várias outras PEPs) Utilizam o módulo typing da biblioteca padrão (Python ≥ 3.5) Primariamente para verificadores estáticos de código-fonte, e não para uso em runtime. 4 def parse_flag(text: str) -> bool: return text.upper() in {'Y', 'YES', 'T', 'TRUE'}

Slide 5

Slide 5 text

SOBRE TIPAGEM GRADUAL Tipagem Dinâmica: verificação de tipos em runtime apenas Ex. Lisp, Smalltalk, Python, JavaScript, Ruby, Clojure, Elixir, etc.
 Tipagem Estática: declarações de tipo no código-fonte, verificadas por ferramentas de análise estática do código, ou pelo compilador—sempre antes de executar Ex. C, C++, Pascal, Java, C#, Haskell, Rust, Kotlin, Swift, Elm, etc.
 Tipagem Gradual: abordagem híbrida—declarações
 de tipo estáticas, mas sem efeito em runtime
 (no runtime, o que vale é a tipagem dinâmica) Ex. ActionScript, Hack, Dart, TypeScript, Python com anotações de tipo, etc. 5

Slide 6

Slide 6 text

ALGUNS VERIFICADORES ESTÁTICOS DE CÓDIGO-FONTE Mypy começou na Dropbox, hoje é parte da organização Python no Github Pytype criado no Google Pyre criado no Facebook PyCharm IDE da JetBrains inclui um verificador interno 6

Slide 7

Slide 7 text

EXEMPLOS 7

Slide 8

Slide 8 text

O PRIMEIRO BUG QUE MYPY ENCONTROU PARA MIM 8

Slide 9

Slide 9 text

RESOLVIDO! random_queens_and_guard.py: https://tgo.li/rnd_queens 9

Slide 10

Slide 10 text

INTERPRETADOR SUBPASCAL Exemplo da Oficina de Linguagens de Programação
 no Garoa Hacker Clube https://tgo.li/OfLiPr2018 10

Slide 11

Slide 11 text

INTERPRETADOR SUBPASCAL: PARSER 11

Slide 12

Slide 12 text

NECESSÁRIO IMPORTAR TIPOS DO MÓDULO TYPING 12

Slide 13

Slide 13 text

NAMED TUPLE & DATA CLASSES PEP 557, Python 3.7 13

Slide 14

Slide 14 text

TYPED NAMED TUPLE 14

Slide 15

Slide 15 text

DATA CLASS 15

Slide 16

Slide 16 text

DATA CLASS COM MAIS CAMPOS 16

Slide 17

Slide 17 text

OVERLOADS Declarações de funções sobrecarregadas 17

Slide 18

Slide 18 text

OVERLOAD EXAMPLE #1 18

Slide 19

Slide 19 text

MAX OVERLOAD 19

Slide 20

Slide 20 text

MAX: TYPE HINTS NO TYPESHED ATÉ JUNHO/2020 20

Slide 21

Slide 21 text

MELHORIAS DEPOIS DO PYTHON 3.5 21

Slide 22

Slide 22 text

MELHORIAS DE USABILIDADE PEP 585 — Type Hinting Generics In Standard Collections A partir do Python 3.9 (backported to 3.7, 3.8) 
 22 from __future__ import annotations def loads(input: Union[str, bytes], *, encoding: Optional[str] = None) -> dict[str, Any]: ...

Slide 23

Slide 23 text

STATIC DUCK TYPING PEP 544 — Protocols: Structural subtyping (static duck typing) 23

Slide 24

Slide 24 text

STATIC DUCK TYPING PEP 544 — Protocols: Structural subtyping (static duck typing) 24

Slide 25

Slide 25 text

EXEMPLO MAIS REALISTA 25

Slide 26

Slide 26 text

MAX: ANOTAÇÕES NO TYPESHED DESDE JUNHO/2020 26

Slide 27

Slide 27 text

MAX: 6 OVERLOADS PARA EXPRESSAR O DINAMISMO 27

Slide 28

Slide 28 text

VANTAGENS 28

Slide 29

Slide 29 text

VANTAGENS DAS ANOTAÇÕES DE TIPO Documentar assinaturas de funções Apoiar a IDE para verificar, completar e refatorar código Encontrar bugs antes de executar o programa Automatizar serialização/desserialização de objetos Sendo opcionais, evitam os problemas de sistemas de tipos estáticos (impossibilidade de expressar ou experimentar algo) 29

Slide 30

Slide 30 text

CUSTO Não existe almoço grátis 30

Slide 31

Slide 31 text

DAVID BEAZLEY NÃO CURTIU... https://twitter.com/dabeaz/status/981699763996450817 31

Slide 32

Slide 32 text

TSUNAMI DE PEPS (MAIS AINDA: 17 PEPS ATÉ JUN/2020) 32 Ano PEP Título Python 2006 3107 Function Annotations 3.0 2014 484 Type Hints 3.5P 483 The Theory of Type Hints N/A 2015 482 Literature Overview for Type Hints N/A 2016 526 Syntax for Variable Annotations 3.6 2017 544 Protocols: Structural subtyping (static duck typing) 3.8 557 Data Classes 3.7 560 Core support for typing module and generic types 3.7 561 Distributing and Packaging Type Information 3.7 563 Postponed Evaluation of Annotations 3.7 2018 586 Literal Types 3.8 2019 585 Type Hinting Usability Conventions 3.8D 589 TypedDict: Type Hints for Dicts with a Fixed Set of Keys 3.8 591 Adding a final qualifier to typing 3.8 3.8

Slide 33

Slide 33 text

DESVANTAGENS Esforço para aprender todo novo um conjunto de abstrações Generics, variância, tipagem estrutural, variáveis de tipo limitadas etc. Esforço para escrever as anotações Normalmente é fácil, mas às vezes é difícil, e pode ser impossível Suporte melhor em versões mais recentes de Python Mas também é possível anotar código de Python 2.7 com comentários, e isso facilita a transição 33

Slide 34

Slide 34 text

CUSTO X BENEFÍCIOS Os benefícios aumentam quando... A base de código fica grande ou muito grande O time é formado por devas profissionais Bernat Gabor* dá uma boa dica:
 se você investe em testes automatizados,
 deve investir em anotações de tipo 
 * link ao final 34

Slide 35

Slide 35 text

FAQ Algumas respostas 35

Slide 36

Slide 36 text

PYTHON VAI VIRAR ESTATICAMENTE TIPADA COMO JAVA? Não. Seção Non-goals da PEP 484: 36

Slide 37

Slide 37 text

QUAL É O EFEITO EM RUNTIME DAS TYPE HINTS? Nenhum. O ambiente de runtime e a biblioteca padrão ignoram as type hints* Também na PEP 484: 37 * algumas exceções, ex.: dataclasses e functools.singledistpatch em import time

Slide 38

Slide 38 text

ISSO SERVE PARA TODA PESSOA QUE USA PYTHON? Não. Usuárias de Python são muito diversas: engenheiras, analistas financeiras, estudantes, cientistas e pesquisadoras de quase todos os campos (física, biologia, sociologia, inteligência artificial). A análise de custo x benefício é diferente para cada grupo. Para aprender a programar ou fazer programação exploratória, as anotações de tipo introduzem complexidade, reduzem a flexibilidade do código e não agregam muito valor. Anotações de tipo são mais úteis em equipes de devs profissionais, com grandes bases de código, acostumadas a ferramental complexas (IDEs, test runners, CI, etc.) 38

Slide 39

Slide 39 text

REFERÊNCIAS Além das Lives do Eduardo Mendes! 39

Slide 40

Slide 40 text

BERNAT GABOR: THE STATE OF TYPE HINTS IN PYTHON https://www.bernat.tech/the-state-of-type-hints-in-python/ 40

Slide 41

Slide 41 text

REAL PYTHON: PYTHON TYPE CHECKING GUIDE https://realpython.com/python-type-checking/ 41

Slide 42

Slide 42 text

Vamos continuar o papo! Twitter: @ramalhoorg E-mail: [email protected] MUITO GRATO!