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

Tipagem Pato, agora com tipos estáticos

Tipagem Pato, agora com tipos estáticos

Palestra feita para PythonBrasil 2020. Apresenta tipagem pato (duck typing) e como fazer anotações de tipo suportando essa forma de programar que é a razão do sucesso de Python. Exemplos incluem novidades do módulo typing como: Protocol, TypeVar e @overload

Luciano Ramalho

November 02, 2020
Tweet

More Decks by Luciano Ramalho

Other Decks in Programming

Transcript

  1. DUCK TYPING FTW
    Protocolos dinâmicos e estáticos:

    o jeito Pythônico de programar,

    agora com type hints para quem precisa delas.
    D e v o l t a a o f u t u r o

    View full-size slide

  2. O LIVRO DO CALANGO: 2ª EDIÇÃO A CAMINHO
    •Disponível como Early Release parcial
    na plataforma O’Reilly Learning
    •Cerca de 100 páginas sobre type hints,
    concentradas em 4 capítulos
    •Novos exemplos simples com asyncio
    e concurrent.futures
    •Capítulo sobre protocolos e classes
    abstratas 100% repensado
    •Versão impressa EN: 3º trimestre, 2021
    •Versão PT-BR: tradução começará
    depois da versão impressa EN
    2

    View full-size slide

  3. PRINCÍPIOS
    3

    View full-size slide

  4. Programe para uma interface, não para uma implementação
    — Primeiro Princípio de Projeto Orientado a Objetos

    Gamma, Helm, Johnson & Vlissides

    em Padrões de Projeto, vulgo

    “o livro da Gangue dos Quatro”

    View full-size slide

  5. Não verifique se é-um pato: verifique se

    grasna-como-um-pato, anda-como-um-pato, etc.

    dependendo de qual parte do comportamento

    semelhante-a-pato você precisa [...]
    — Alex Martelli em

    comp-lang-python, 2000-07-26

    View full-size slide

  6. TIPAGEM PATO
    6

    View full-size slide

  7. EXEMPLO: DOUBLE
    7
    Código-fonte dos exemplos em:

    https://github.com/fluentpython/protocol_examples

    View full-size slide

  8. EXEMPLO: DOUBLE
    8

    View full-size slide

  9. EXEMPLO: DOUBLE
    9

    View full-size slide

  10. EXEMPLO: DOUBLE
    10
    Como anotar o tipo de x?

    View full-size slide

  11. EXEMPLO: DOUBLE
    11
    o tipo de x é "qualquer coisa
    capaz de multiplicar"

    View full-size slide

  12. EXEMPLO: DOUBLE
    12
    o tipo de x é "qualquer coisa
    capaz de multiplicar"
    em outras palavras,

    x precisa implementar
    __mul__

    View full-size slide

  13. EXEMPLO: DOUBLE
    13
    o que acontece quando x
    não implementa __mul__?

    View full-size slide

  14. EXEMPLO: DOUBLE
    14
    o que acontece quando x
    não implementa __mul__?
    TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

    View full-size slide

  15. A BIBLIOTECA PADRÃO ESTÁ CHEIA DE EXEMPLOS ASSIM...
    max(arg1, arg2, *args[, key])
    15

    View full-size slide

  16. A BIBLIOTECA PADRÃO ESTÁ CHEIA DE EXEMPLOS ASSIM...
    max(arg1, arg2, *args[, key])
    max(iterable, *[, key, default])

    16

    View full-size slide

  17. A BIBLIOTECA PADRÃO ESTÁ CHEIA DE EXEMPLOS ASSIM...
    max(arg1, arg2, *args[, key])
    max(iterable, *[, key, default])

    sorted(iterable, *, key=None, reverse=False)
    17

    View full-size slide

  18. A BIBLIOTECA PADRÃO ESTÁ CHEIA DE EXEMPLOS ASSIM...
    max(arg1, arg2, *args[, key])
    max(iterable, *[, key, default])

    sorted(iterable, *, key=None, reverse=False)
    sum(iterable, /, start=0)
    18

    View full-size slide

  19. O PROBLEMA COM MAX
    19

    View full-size slide

  20. TIPAGEM PATO NA PRÁTICA
    22

    View full-size slide

  21. EXEMPLO DO PYTHON FLUENTE: CLASSE VECTOR
    Vector: sequência de float (entre array.array e numpy.array)
    23

    View full-size slide

  22. VECTOR: IMPLEMENTAÇÃO
    24

    View full-size slide

  23. VECTOR: INICIALIZADOR
    25

    View full-size slide

  24. VECTOR: OPERADOR [ ] — 1ª VERSÃO
    26
    TypeError: array indices must be integers

    View full-size slide

  25. VECTOR: OPERADOR [ ] — 1ª VERSÃO C/ MENSAGEM ESPECÍFICA
    27
    TypeError: key must be index or slice

    View full-size slide

  26. VECTOR: OPERADOR [ ] — 2ª VERSÃO
    28
    TypeError: 'tuple' object cannot be interpreted as an integer

    View full-size slide

  27. ANOTAÇÃO COM PROTOCOLO
    29

    View full-size slide

  28. VECTOR: OPERADOR [ ] — TYPEVAR
    30
    quando key é uma slice,

    o resultado tem o

    mesmo tipo de self

    View full-size slide

  29. VECTOR: OPERADOR [ ] — COM ANOTAÇÕES
    31
    quando key
    SupportsIndex,
    o resultado é
    um float

    View full-size slide

  30. DOUBLE COM ANOTAÇÃO
    32

    View full-size slide

  31. DOUBLE: 1ª TENTATIVA...
    33
    Mypy rejeita:
    object não
    implementa
    __mul__

    View full-size slide

  32. DOUBLE: 2ª TENTATIVA...
    34
    Mypy aceita, mas
    essas anotações não
    ajudam em nada:
    Any é o tipo default

    View full-size slide

  33. DOUBLE: 3ª TENTATIVA...
    35

    Mypy aceita, mas só
    para sequências.

    View full-size slide

  34. DOUBLE: A SOLUÇÃO
    36
    Definição do protocolo Repeatable
    exige método __mul__, que:
    • aceita self e um int;

    • devolve algo do mesmo tipo de self

    View full-size slide

  35. DOUBLE: A SOLUÇÃO
    37
    Assinatura de double:

    • aceita um x que seja Repeatable

    • devolve resultado do mesmo tipo de x

    View full-size slide

  36. DOUBLE: A SOLUÇÃO
    38

    View full-size slide

  37. SOLUÇÃO PARA MAX
    39

    View full-size slide

  38. COMENDO PELAS BORDAS: SOLUÇÃO PARA LIST.SORT
    40

    View full-size slide

  39. SOLUÇÃO PARA MAX
    41

    View full-size slide

  40. INTERFACES EM PYTHON
    42

    View full-size slide

  41. O BENDITO CAPÍTULO 13...
    43

    View full-size slide

  42. 44
    Socorro!

    Por onde eu começo?

    View full-size slide

  43. COMO LIDAMOS COM INTERFACES EM PYTHON
    Protocolo:

    qualquer objeto que implementa .quack() é um pato.

    45

    View full-size slide

  44. COMO LIDAMOS COM INTERFACES EM PYTHON
    Protocolo:

    qualquer objeto que implementa .quack() é um pato.


    ABC (Abstract Base Class):

    uma instância de Marreco é um pato

    porque Marreco herda de Pato.
    46

    View full-size slide

  45. COMO LIDAMOS COM INTERFACES EM PYTHON
    Protocolo:

    qualquer objeto que implementa .quack() é um pato.


    ABC (Abstract Base Class):

    uma instância de Marreco é um pato

    porque Marreco herda de Pato.
    47
    “objeto semelhante a pato”

    (duck-like object) é um

    TIPO ESTRUTURAL

    View full-size slide

  46. COMO LIDAMOS COM INTERFACES EM PYTHON
    Protocolo:

    qualquer objeto que implementa .quack() é um pato.


    ABC (Abstract Base Class):

    uma instância de Marreco é um pato

    porque Marreco herda de Pato.
    48
    “objeto semelhante a pato”

    (duck-like object) é um

    TIPO ESTRUTURAL
    Marreco é um 

    TIPO NOMINAL

    View full-size slide

  47. QUATRO ABORDAGENS PARA TIPOS
    49
    TIPOS ESTRUTURAIS TIPOS NOMINAIS
    VERIFICAÇÃO DINÂMICA
    (durante a execução)
    VERIFICAÇÃO ESTÁTICA
    (antes da execução)
    tipagem

    pato

    View full-size slide

  48. QUATRO ABORDAGENS PARA TIPOS
    50
    TIPOS ESTRUTURAIS TIPOS NOMINAIS
    VERIFICAÇÃO DINÂMICA
    (durante a execução)
    VERIFICAÇÃO ESTÁTICA
    (antes da execução)
    tipagem

    pato
    tipagem

    estática

    View full-size slide

  49. QUATRO ABORDAGENS PARA TIPOS
    51
    TIPOS ESTRUTURAIS TIPOS NOMINAIS
    VERIFICAÇÃO DINÂMICA
    (durante a execução)
    VERIFICAÇÃO ESTÁTICA
    (antes da execução)
    tipagem

    pato
    tipagem

    estática
    tipagem
    pato
    estática

    View full-size slide

  50. QUATRO ABORDAGENS PARA TIPOS
    52
    TIPOS ESTRUTURAIS TIPOS NOMINAIS
    VERIFICAÇÃO DINÂMICA
    (durante a execução)
    VERIFICAÇÃO ESTÁTICA
    (antes da execução)
    tipagem

    pato
    tipagem

    estática
    tipagem
    pato
    estática
    tipagem

    ganso
    assunto para
    outro dia...

    View full-size slide

  51. 53
    O mapa do
    capítulo 13!

    View full-size slide

  52. e-mail: [email protected]
    Twitter: @ramalhoorg
    MUITO GRATO!

    View full-size slide