Upgrade to Pro — share decks privately, control downloads, hide ads and more …

O melhor de type hints—TDC BH Online

O melhor de type hints—TDC BH Online

Introdução à sintaxe e significado das anotações de tipo a partir de Python 3.5

Luciano Ramalho

April 25, 2020
Tweet

More Decks by Luciano Ramalho

Other Decks in Programming

Transcript

  1. 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

    View full-size slide

  2. TYPE HINTS?
    Que novidade é essa?
    2

    View full-size slide

  3. 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'}

    View full-size slide

  4. 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

    View full-size slide

  5. 5
    O PROBLEMA

    DAS 8 RAINHAS

    View full-size slide

  6. O PROBLEMA

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

    View full-size slide

  7. 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

    View full-size slide

  8. 8 RAINHAS: DEMONSTRAÇÃO
    8

    View full-size slide

  9. 8 RAINHAS: DEMONSTRAÇÃO
    9

    View full-size slide

  10. 8 RAINHAS: DEMONSTRAÇÃO
    10

    View full-size slide

  11. 8 RAINHAS: DEMONSTRAÇÃO
    11

    View full-size slide

  12. 16 RAINHAS
    12

    View full-size slide

  13. 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

    View full-size slide

  14. MYPY INDICA ONDE ESTÁ O ERRO
    14

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. INTERPRETADOR SUBPASCAL
    Exemplo da Oficina de
    Linguagens de Programação

    no Garoa Hacker Clube
    https://tgo.li/OfLiPr2018
    17

    View full-size slide

  18. INTERPRETADOR SUBPASCAL: PARSER
    18

    View full-size slide

  19. INTERPRETADOR SUBPASCAL: PARSER
    19

    View full-size slide

  20. 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]:
    ...

    View full-size slide

  21. DATA CLASSES
    PEP 557, Python 3.7
    21

    View full-size slide

  22. NAMED TUPLE (SEM TIPOS)
    22

    View full-size slide

  23. NAMED TUPLE (COM TIPOS)
    23

    View full-size slide

  24. DATA CLASS COM 2 CAMPOS
    24

    View full-size slide

  25. DATA CLASS COM 8 CAMPOS
    25

    View full-size slide

  26. BENEFÍCIOS
    26

    View full-size slide

  27. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  30. 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

    View full-size slide

  31. 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

    View full-size slide

  32. 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

    View full-size slide

  33. FAQ
    Respostas para algumas perguntas frequentes
    33

    View full-size slide

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

    View full-size slide

  35. 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

    View full-size slide

  36. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide