Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

PRINCÍPIOS 3

Slide 4

Slide 4 text

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”

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

TIPAGEM PATO 6

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

EXEMPLO: DOUBLE 8

Slide 9

Slide 9 text

EXEMPLO: DOUBLE 9

Slide 10

Slide 10 text

EXEMPLO: DOUBLE 10 Como anotar o tipo de x?

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

O PROBLEMA COM MAX 19

Slide 20

Slide 20 text

20

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

TIPAGEM PATO NA PRÁTICA 22

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

VECTOR: IMPLEMENTAÇÃO 24

Slide 25

Slide 25 text

VECTOR: INICIALIZADOR 25

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

ANOTAÇÃO COM PROTOCOLO 29

Slide 30

Slide 30 text

VECTOR: OPERADOR [ ] — TYPEVAR 30 quando key é uma slice,
 o resultado tem o
 mesmo tipo de self

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

DOUBLE COM ANOTAÇÃO 32

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

DOUBLE: 3ª TENTATIVA... 35 Mypy aceita, mas só para sequências.

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

DOUBLE: A SOLUÇÃO 37 Assinatura de double:
 • aceita um x que seja Repeatable
 • devolve resultado do mesmo tipo de x

Slide 38

Slide 38 text

DOUBLE: A SOLUÇÃO 38

Slide 39

Slide 39 text

SOLUÇÃO PARA MAX 39

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

SOLUÇÃO PARA MAX 41

Slide 42

Slide 42 text

INTERFACES EM PYTHON 42

Slide 43

Slide 43 text

O BENDITO CAPÍTULO 13... 43

Slide 44

Slide 44 text

44 Socorro!
 Por onde eu começo?

Slide 45

Slide 45 text

COMO LIDAMOS COM INTERFACES EM PYTHON Protocolo:
 qualquer objeto que implementa .quack() é um pato.
 45

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

53 O mapa do capítulo 13!

Slide 54

Slide 54 text

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