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

Protocol: pedra angular das type hints em Python

Protocol: pedra angular das type hints em Python

Saiba porquê `typing.Protocol` foi o 
acréscimo mais importante do
 sistema de tipos estáticos de Python.

Versão revisada, incluindo explicação sobre o problema de `numbers.Number` no final.

Luciano Ramalho

March 24, 2021
Tweet

More Decks by Luciano Ramalho

Other Decks in Programming

Transcript

  1. PEDRA ANGULAR DE TYPE HINTS
    Porquê typing.Protocol foi o

    acréscimo mais importante do

    sistema de tipos estáticos de Python
    P r o t o c o l o s
    🦆

    View Slide

  2. PEDRA ANGULAR
    2

    View Slide

  3. 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,
    em 4 capítulos + dezenas de exemplos
    •Novos exemplos simples com asyncio
    e concurrent.futures
    •Capítulo sobre protocolos e classes
    abstratas 100% repensado
    •Versão impressa EN: 4º trimestre, 2021
    •Versão PT-BR: tradução começará
    depois da versão impressa EN
    3

    View Slide

  4. ESTUDO DE CASO: MAX(...)
    4

    View Slide

  5. A FUNÇÃO MAX(...)
    5

    View Slide

  6. UMA IMPLEMENTAÇÃO: MYMAX.MAX(...)
    Código dos exemplos no
    Github:
    6
    http://bit.ly/mymax-tdc

    View Slide

  7. MYMAX.MAX(...) COM ANOTAÇÕES DE TIPO
    Código dos exemplos no
    Github:
    7
    http://bit.ly/mymax-tdc

    View Slide

  8. CASO MAX: PASSO A PASSO
    Comparando inteiros
    8

    View Slide

  9. PASSO 0: COMPARANDO DOIS INTEIROS
    9
    http://bit.ly/mymax-tdc

    View Slide

  10. TROPEÇO 1: COMPARANDO DOIS NÚMEROS #SQN
    10
    Porque não fazer assim?

    View Slide

  11. O IDEAL É SER PRECISO NOS TIPOS DE RETORNO
    11
    Normalmente você sabe qual o tipo sua função vai devolver,
    então especifique o tipo da forma mais precisa.
    Lembre-se da Lei de Postel, ou Princípio da Robustez

    View Slide

  12. 12
    Seja rigoroso com o que você envia, e tolerante com o que você recebe.
    —Jon Postel

    View Slide

  13. PASSO 1: COMPARANDO DOIS NÚMEROS
    13

    View Slide

  14. PASSO 1: COMPARANDO DOIS NÚMEROS
    14
    No módulo numbers de
    Python já existe uma ABC
    numbers.Number.

    Porque não usá-la?

    View Slide

  15. PASSO 1: COMPARANDO DOIS NÚMEROS
    15
    No módulo numbers de
    Python já existe uma ABC
    numbers.Number.

    Porque não usá-la?
    Resposta no final, se der
    tempo e alguém perguntar...

    View Slide

  16. PASSO 2: COMPARANDO DOIS OBJETOS COMPARÁVEIS
    O que é comparável em Python?
    Vamos perguntar no console do interpretador:
    16

    View Slide

  17. DUCK TYPING OU TIPAGEM PATO: A ORIGEM DO TERMO
    17
    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 Slide

  18. PASSO 2: COMPARANDO DOIS OBJETOS COMPARÁVEIS
    18

    View Slide

  19. PASSO 3: COMPARANDO N OBJETOS
    19

    View Slide

  20. PASSO 4: COMPARANDO N OBJETOS, COM FUNÇÃO KEY=
    20

    View Slide

  21. PASSO 4: COMPARANDO N OBJETOS, COM FUNÇÃO KEY=
    21

    View Slide

  22. PASSO 4: COMPARANDO N OBJETOS, COM FUNÇÃO KEY=
    22

    View Slide

  23. INTERFACES EM PYTHON
    23

    View Slide

  24. INTERFACE É A CHAVE
    24
    Programe para uma interface, não para uma implementação
    — 1º Princípio de Projeto Orientado a Objetos

    descrito no livro Padrões de Projeto de

    Gamma, Helm, Johnson & Vlissides


    View Slide

  25. O BENDITO CAPÍTULO 13...
    25

    View Slide

  26. 26
    Socorro!

    Por onde eu começo?

    View Slide

  27. COMO LIDAMOS COM INTERFACES EM PYTHON
    Protocolo:

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

    27

    View Slide

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

    View Slide

  29. 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.
    29
    “objeto semelhante a pato”

    (duck-like object) é um

    TIPO ESTRUTURAL

    View Slide

  30. 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.
    30
    “objeto semelhante a pato”

    (duck-like object) é um

    TIPO ESTRUTURAL
    Marreco é um 

    TIPO NOMINAL

    View Slide

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

    pato

    View Slide

  32. QUATRO ABORDAGENS PARA TIPOS
    32
    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 Slide

  33. QUATRO ABORDAGENS PARA TIPOS
    33
    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 Slide

  34. QUATRO ABORDAGENS PARA TIPOS
    34
    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 Slide

  35. 35
    O mapa do
    capítulo 13!

    View Slide

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

    View Slide

  37. 37
    Veja o código completo da
    classe abstrata (ABC)
    numbers.Number
    Ela não serve para tipagem
    estática porque não define
    nenhum método!
    Se você declarar uma variável
    do tipo numbers.Number, o
    Mypy rejeitará qualquer
    operação com essa variável!

    View Slide