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

27c093d0834208f4712faaaec38c2c5c?s=128

Luciano Ramalho

November 02, 2020
Tweet

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
  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
  3. PRINCÍPIOS 3

  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”
  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
  6. TIPAGEM PATO 6

  7. EXEMPLO: DOUBLE 7 Código-fonte dos exemplos em:
 https://github.com/fluentpython/protocol_examples

  8. EXEMPLO: DOUBLE 8

  9. EXEMPLO: DOUBLE 9

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

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

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

    capaz de multiplicar" em outras palavras,
 x precisa implementar __mul__
  13. EXEMPLO: DOUBLE 13 o que acontece quando x não implementa

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

    __mul__? TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
  15. A BIBLIOTECA PADRÃO ESTÁ CHEIA DE EXEMPLOS ASSIM... max(arg1, arg2,

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

    *args[, key]) max(iterable, *[, key, default])
 16
  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
  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
  19. O PROBLEMA COM MAX 19

  20. 20

  21. None
  22. TIPAGEM PATO NA PRÁTICA 22

  23. EXEMPLO DO PYTHON FLUENTE: CLASSE VECTOR Vector: sequência de float

    (entre array.array e numpy.array) 23
  24. VECTOR: IMPLEMENTAÇÃO 24

  25. VECTOR: INICIALIZADOR 25

  26. VECTOR: OPERADOR [ ] — 1ª VERSÃO 26 TypeError: array

    indices must be integers
  27. VECTOR: OPERADOR [ ] — 1ª VERSÃO C/ MENSAGEM ESPECÍFICA

    27 TypeError: key must be index or slice
  28. VECTOR: OPERADOR [ ] — 2ª VERSÃO 28 TypeError: 'tuple'

    object cannot be interpreted as an integer
  29. ANOTAÇÃO COM PROTOCOLO 29

  30. VECTOR: OPERADOR [ ] — TYPEVAR 30 quando key é

    uma slice,
 o resultado tem o
 mesmo tipo de self
  31. VECTOR: OPERADOR [ ] — COM ANOTAÇÕES 31 quando key

    SupportsIndex, o resultado é um float
  32. DOUBLE COM ANOTAÇÃO 32

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

  34. DOUBLE: 2ª TENTATIVA... 34 Mypy aceita, mas essas anotações não

    ajudam em nada: Any é o tipo default
  35. DOUBLE: 3ª TENTATIVA... 35 Mypy aceita, mas só para sequências.

  36. 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
  37. DOUBLE: A SOLUÇÃO 37 Assinatura de double:
 • aceita um

    x que seja Repeatable
 • devolve resultado do mesmo tipo de x
  38. DOUBLE: A SOLUÇÃO 38

  39. SOLUÇÃO PARA MAX 39

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

  41. SOLUÇÃO PARA MAX 41

  42. INTERFACES EM PYTHON 42

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

  44. 44 Socorro!
 Por onde eu começo?

  45. COMO LIDAMOS COM INTERFACES EM PYTHON Protocolo:
 qualquer objeto que

    implementa .quack() é um pato.
 45
  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. 46
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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...
  53. 53 O mapa do capítulo 13!

  54. e-mail: luciano.ramalho@thoughtworks.com Twitter: @ramalhoorg MUITO GRATO!