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 🦆
  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, 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
  3. 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
  4. 12 Seja rigoroso com o que você envia, e tolerante

    com o que você recebe. —Jon Postel
  5. PASSO 1: COMPARANDO DOIS NÚMEROS 14 No módulo numbers de

    Python já existe uma ABC numbers.Number.
 Porque não usá-la?
  6. 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...
  7. PASSO 2: COMPARANDO DOIS OBJETOS COMPARÁVEIS O que é comparável

    em Python? Vamos perguntar no console do interpretador: 16
  8. 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
  9. 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

  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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...
  17. 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!