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!