Slide 1

Slide 1 text

S ã o o p c i o n a i s ! O MELHOR DE TYPE HINTS Introdução à sintaxe de type hints
 e o módulo typing do Python ≥ 3.5 Luciano Ramalho @ramalhoorg

Slide 2

Slide 2 text

TYPE HINTS? Que novidade é essa? 2

Slide 3

Slide 3 text

SINTAXE PARA DECLARAÇÃO ESTÁTICA DE TIPOS Formalizada no PEP 484 — Type Hints Implementada a partir de Python 3.5 3 def parse_flag(text: str) -> bool: return text.upper() in {'Y', 'YES', 'T', 'TRUE'}

Slide 4

Slide 4 text

TIPAGEM: DINÂMICA, ESTÁTICA, OU GRADUAL Tipagem dinâmica: verificação de tipos somente na execução Ex. Lisp, Smalltalk, Python, JavaScript, Ruby, Clojure, Elixir, etc.
 Tipagem estática: declaração de tipos no código-fonte, verificação na compilação Ex. C, C++, Pascal, Java, C#, Haskell, Rust, Kotlin, Swift, Elm, etc.
 Tipagem gradual: declaração de tipos opcional, verificação na compilação ou por type checkers, normalmente sem efeito na execução Ex. ActionScript, Hack, Dart, TypeScript, etc. 4

Slide 5

Slide 5 text

5 O PROBLEMA
 DAS 8 RAINHAS

Slide 6

Slide 6 text

O PROBLEMA
 DAS 8 RAINHAS Um problema clássico usado por Dijkstra para ilustrar backtracking 6

Slide 7

Slide 7 text

8 RAINHAS: SOLUÇÃO ORIENTADA A OBJETOS Pythonic Objects: Idiomatic OOP in Python na PyCon US 2019 https://www.youtube.com/watch?v=mUu_4k6a5-I 7

Slide 8

Slide 8 text

8 RAINHAS: DEMONSTRAÇÃO 8

Slide 9

Slide 9 text

8 RAINHAS: DEMONSTRAÇÃO 9

Slide 10

Slide 10 text

8 RAINHAS: DEMONSTRAÇÃO 10

Slide 11

Slide 11 text

8 RAINHAS: DEMONSTRAÇÃO 11

Slide 12

Slide 12 text

16 RAINHAS 12

Slide 13

Slide 13 text

8 RAINHAS: SOLUÇÃO ORIENTADA A OBJETOS Escrito em Python a partir dos exemplos em Smalltalk e Ruby do capítulo 6 de An Introduction to Object-Oriented Programming 3 ed, de Tim Budd. https://github.com/ramalho/pyob/ 13

Slide 14

Slide 14 text

MYPY INDICA ONDE ESTÁ O ERRO 14

Slide 15

Slide 15 text

CÓDIGO CONSERTADO random_queens_and_guard.py: https://tgo.li/rnd_queens 15

Slide 16

Slide 16 text

INTERPRETADORES Meus primeiros exemplos com anotações de tipo 16

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

INTERPRETADOR SUBPASCAL: PARSER 18

Slide 19

Slide 19 text

INTERPRETADOR SUBPASCAL: PARSER 19

Slide 20

Slide 20 text

FUTURO PRÓXIMO: MELHORIAS NA USABILIDADE PEP 585 — Type Hinting Generics In Standard Collections A partir de Python 3.9 (backport para 3.7 e 3.8) 
 20 from __future__ import annotations def loads(input: Union[str, bytes], *, encoding: Optional[str] = None) -> dict[str, Any]: ...

Slide 21

Slide 21 text

DATA CLASSES PEP 557, Python 3.7 21

Slide 22

Slide 22 text

NAMED TUPLE (SEM TIPOS) 22

Slide 23

Slide 23 text

NAMED TUPLE (COM TIPOS) 23

Slide 24

Slide 24 text

DATA CLASS COM 2 CAMPOS 24

Slide 25

Slide 25 text

DATA CLASS COM 8 CAMPOS 25

Slide 26

Slide 26 text

BENEFÍCIOS 26

Slide 27

Slide 27 text

VANTAGENS DE TIPAGEM ESTÁTICA Documentar a assinatura das funções Auxiliar a IDE, inclusive com refatorações automáticas Identificar bugs antes de rodar o programa Facilitar serialização de objetos (dica do Bruno Rocha) É opcional: filosofia gradual typing 27

Slide 28

Slide 28 text

CUSTO Não existe almoço de graça 28

Slide 29

Slide 29 text

DAVID BEAZLEY NÃO ESTÁ CURTINDO... https://twitter.com/dabeaz/status/981699763996450817 29

Slide 30

Slide 30 text

ENXURRADA DE PEPS 30 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 31

Slide 31 text

DESVANTAGENS Esforço para aprender uma nova série de abstrações Generics, covariância, contravariância, tipagem estrutural, etc.
 Tempo para escrever anotações de tipo Às vezes é complicado exprimir o que precisamos
 Melhor suportado nas versões mais recentes de Python Python 3.8: avanços importantes de usabilidade e expressividade
 Aumento do tempo de inicialização do programa Relevante só para pequenos scripts, não para processos de longa duração 31

Slide 32

Slide 32 text

CUSTO X BENEFÍCIO Os benefícios são maiores quando... O time ou a comunidade de desenvolvedoras é grande. O sistema é grande, complexo, e vai precisar evoluir muito. Bernat Gabor* dá uma boa regra:
 se você investe em testes, deve investir em type hints 
 * referência no final 32

Slide 33

Slide 33 text

FAQ Respostas para algumas perguntas frequentes 33

Slide 34

Slide 34 text

PYTHON VAI VIRAR UMA LINGUAGEM DE TIPOS ESTÁTICOS? Não. Na seção Non-goals da PEP 484 está escrito: 34

Slide 35

Slide 35 text

QUAL O IMPACTO DAS ANOTAÇÕES NA EXECUÇÃO DO PROGRAMA? Em princípio, nenhum. O interpretador e a biblioteca padrão desconsideram as anotações de tipos* Diz a PEP 484: 35 * há duas exceções no módulo dataclasses

Slide 36

Slide 36 text

TODO MUNDO DEVE USAR TYPE HINTS? Não. As pessoas que usam Python são muito diversas: engenheiras, analistas financeiros, estudantes, cientistas e especialistas das mais diversas áreas (física, biologia, sociologia, inteligência artificial). A análise de custo x benefício não é igual para todos esses grupos. 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 trazem grande valor. Type hints é mais útil em times de desenvolvedoras profissionais, com bases de código grandes, acostumadas com um ferramental mais complexo (IDEs, linters, testes automatizados, integração continua etc.) 36

Slide 37

Slide 37 text

REFERÊNCIAS Antes de ler todos aqueles PEPs... 37

Slide 38

Slide 38 text

REFERÊNCIAS EM PORTUGUÊS Live de Python (sugestão do Eduardo Mendes @dunossauro) 38

Slide 39

Slide 39 text

REAL PYTHON: PYTHON TYPE CHECKING GUIDE https://realpython.com/python-type-checking/ 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

Vamos continuar essa troca de ideias! Twitter: @ramalhoorg E-mail: [email protected] MUITO GRATO