You are on page 1of 11

Python Fluente

Luciano Ramalho

Novatec
Sumário

Prefácio............................................................................................................................. 17

Parte I ■ Prólogo................................................................................................. 27
Capítulo 1 ■ Modelo de dados do Python.............................................................................28
Um baralho pythônico.....................................................................................29
Como os métodos especiais são usados............................................................ 33
Emulando tipos numéricos..........................................................................34
Representação em string..............................................................................36
Operadores aritméticos............................................................................... 37
Valor booleano de um tipo definido pelo usuário......................................... 37
Visão geral dos métodos especiais....................................................................38
Por que len não é um método?.......................................................................... 39
Resumo do capítulo.........................................................................................40
Leituras complementares................................................................................. 41

Parte II ■ Estruturas de dados.............................................................................. 43


Capítulo 2 ■ Uma coleção de sequências..............................................................................44
Visão geral das sequências embutidas............................................................... 45
List comprehensions e expressões geradoras.....................................................46
List comprehensions e legibilidade...............................................................46
Comparação entre listcomps e map/filter.....................................................48
Produtos cartesianos...................................................................................49
Expressões geradoras..................................................................................50
Tuplas não são apenas listas imutáveis.............................................................. 52
Tuplas como registros.................................................................................. 52
Desempacotamento de tuplas...................................................................... 53
Desempacotamento de tuplas aninhadas...................................................... 55
Tuplas nomeadas......................................................................................... 56
Tuplas como listas imutáveis........................................................................ 58

7
8 Python Fluente

Fatiamento...................................................................................................... 59
Por que as fatias e os intervalos excluem o último item................................. 59
Objetos slice...............................................................................................60
Fatiamento multidimensional e reticências................................................... 62
Atribuição de valores a fatias....................................................................... 62
Usando + e * com sequências............................................................................63
Criando listas de listas................................................................................64
Atribuições combinadas e sequências...............................................................65
O enigma da atribuição +=..........................................................................67
list.sort e a função embutida sorted.................................................................. 69
Administrando sequências ordenadas com bisect.............................................. 71
Pesquisando com bisect............................................................................... 71
Inserção com bisect.insort........................................................................... 74
Quando uma lista não é a resposta................................................................... 75
Arrays......................................................................................................... 75
Memory Views............................................................................................ 78
NumPy e SciPy...........................................................................................80
Deques e outras filas...................................................................................82
Resumo do capítulo.........................................................................................86
Leituras complementares................................................................................. 87

Capítulo 3 ■ Dicionários e conjuntos....................................................................................93


Tipos genéricos de mapeamento.......................................................................94
dict comprehensions........................................................................................96
Visão geral dos métodos comuns a mapeamentos.............................................. 97
Tratando chaves ausentes com setdefault.....................................................98
Mapeamentos com consulta de chave flexível.................................................. 101
defaultdict: outra abordagem para chaves ausentes..................................... 101
Método __missing__ ............................................................................... 102
Variações de dict............................................................................................ 105
Criando subclasses de UserDict...................................................................... 106
Mapeamentos imutáveis................................................................................. 108
Teoria dos conjuntos...................................................................................... 109
Literais de set............................................................................................ 111
Set comprehensions................................................................................... 113
Operações de conjuntos............................................................................ 113
Por dentro de dict e set................................................................................... 116
Um experimento para testar o desempenho............................................... 116
Tabelas hash em dicionários...................................................................... 118
Consequências práticas de como os dicionários funcionam........................ 121
Como os conjuntos funcionam – consequências práticas............................ 125
Resumo do capítulo....................................................................................... 125
Leituras complementares............................................................................... 126
Sumário 9

Capítulo 4 ■ Texto versus bytes......................................................................................... 129


Falhas de caracteres....................................................................................... 130
O essencial sobre bytes.................................................................................. 131
Structs e memory views............................................................................. 134
Codificadores/decodificadores básicos............................................................ 135
Entendendo os problemas de codificação/decodificação.................................. 137
Lidando com UnicodeEncodeError............................................................ 138
Lidando com UnicodeDecodeError............................................................ 139
SyntaxError ao carregar módulos com codificação inesperada.................... 140
Como descobrir a codificação de uma sequência de bytes........................... 142
BOM: um gremlin útil............................................................................... 142
Lidando com arquivos-texto........................................................................... 144
Defaults de codificação: um hospício......................................................... 147
Normalizando Unicode para comparações mais seguras................................. 150
Case folding.............................................................................................. 153
Funções utilitárias para comparações normalizadas................................... 154
“Normalização” extrema: removendo acentos............................................ 155
Ordenação de texto Unicode.......................................................................... 159
Ordenação com o Unicode Collation Algorithm ........................................ 161
Base de dados Unicode................................................................................... 161
APIs de modo dual para str e bytes................................................................. 163
str versus bytes em expressões regulares.................................................... 163
str versus bytes em funções de os............................................................... 165
Resumo do capítulo....................................................................................... 167
Leituras complementares............................................................................... 169

Parte III ■ Funções como objetos........................................................................174


Capítulo 5 ■ Funções de primeira classe............................................................................. 175
Tratando uma função como um objeto........................................................... 176
Funções de ordem superior............................................................................. 177
Substitutos modernos para map, filter e reduce.......................................... 178
Funções anônimas......................................................................................... 180
As sete variações de objetos invocáveis........................................................... 181
Tipos invocáveis definidos pelo usuário.......................................................... 182
Introspecção de função.................................................................................. 183
De parâmetros posicionais a parâmetros exclusivamente nomeados................ 185
Obtendo informações sobre parâmetros......................................................... 187
Anotações de função...................................................................................... 192
Pacotes para programação funcional............................................................... 194
Módulo operator....................................................................................... 194
Congelando argumentos com functools.partial.......................................... 198
10 Python Fluente

Resumo do capítulo.......................................................................................200
Leituras complementares............................................................................... 201

Capítulo 6 ■ Padrões de projeto com funções de primeira classe......................................... 205


Estudo de caso: refatorando Strategy.............................................................. 206
Strategy clássico........................................................................................ 206
Strategy orientado a função....................................................................... 210
Escolhendo a melhor estratégia: abordagem simples................................... 213
Encontrando estratégias em um módulo.................................................... 214
Command..................................................................................................... 216
Resumo do capítulo....................................................................................... 218
Leituras complementares............................................................................... 219

Capítulo 7 ■ Decoradores de função e closures................................................................... 222


Básico sobre decoradores................................................................................223
Quando Python executa os decoradores......................................................... 224
Padrão Strategy melhorado com decorador..................................................... 226
Regras para escopo de variáveis...................................................................... 228
Closures........................................................................................................ 232
Declaração nonlocal....................................................................................... 235
Implementando um decorador simples........................................................... 237
Funcionamento......................................................................................... 238
Decoradores da biblioteca-padrão................................................................... 240
Memoização com functools.lru_cache....................................................... 240
Funções genéricas com dispatch simples.................................................... 243
Decoradores empilhados................................................................................ 246
Decoradores parametrizados.......................................................................... 247
Um decorador de registro parametrizado................................................... 247
Decorador clock parametrizado................................................................. 249
Resumo do capítulo....................................................................................... 252
Leituras complementares............................................................................... 253

Parte IV ■ Práticas de orientação a objetos........................................................ 257


Capítulo 8 ■ Referências a objetos, mutabilidade e reciclagem.......................................... 258
Variáveis não são caixas................................................................................. 259
Identidade, igualdade e apelidos..................................................................... 260
Escolhendo entre == e is........................................................................... 262
A relativa imutabilidade das tuplas............................................................ 263
Cópias são rasas por padrão........................................................................... 264
Cópias profundas e rasas de objetos quaisquer........................................... 267
Sumário 11

Parâmetros de função como referências.......................................................... 268


Tipos mutáveis como default de parâmetros: péssima ideia......................... 270
Programação defensiva com parâmetros mutáveis...................................... 272
del e coleta de lixo.......................................................................................... 274
Referências fracas.......................................................................................... 276
Esquete com WeakValueDictionary........................................................... 277
Limitações das referências fracas............................................................... 279
Truques de Python com imutáveis..................................................................280
Resumo do capítulo....................................................................................... 282
Leituras complementares............................................................................... 283

Capítulo 9 ■ Um objeto pythônico.....................................................................................288


Representações de objetos.............................................................................. 289
Retorno da classe Vector................................................................................ 289
Um construtor alternativo.............................................................................. 292
classmethod versus staticmethod.................................................................... 293
Apresentações formatadas.............................................................................. 295
Um Vector2d hashable................................................................................... 298
Atributos privados e “protegidos” em Python.................................................. 304
Economizando espaço com o atributo de classe __slots__ ............................. 307
Os problemas com __slots__.................................................................... 309
Sobrescrita de atributos de classe.................................................................... 310
Resumo do capítulo....................................................................................... 312
Leituras complementares............................................................................... 313

Capítulo 10 ■ Hackeando e fatiando sequências................................................................ 318


Vector: um tipo de sequência definido pelo usuário......................................... 319
Vector tomada #1: compatível com Vector2d.................................................. 319
Protocolos e duck typing................................................................................ 322
Vector tomada #2: uma sequência que permite fatiamento.............................. 323
Como funciona o fatiamento..................................................................... 324
Um __getitem__ que considera fatias........................................................ 327
Vector tomada #3: acesso dinâmico a atributos.............................................. 328
Vector tomada #4: hashing e um == mais rápido............................................ 332
Vector tomada #5: formatação....................................................................... 338
Resumo do capítulo....................................................................................... 345
Leituras complementares............................................................................... 347

Capítulo 11 ■ Interfaces: de protocolos a ABCs................................................................... 352


Interfaces e protocolos na cultura de Python................................................... 353
Python curte sequências................................................................................. 355
Monkey-patching para implementar um protocolo em tempo de execução....... 357
Aves aquáticas de Alex Martelli...................................................................... 359
12 Python Fluente

Criando subclasses de uma ABC.................................................................... 365


ABCs da biblioteca-padrão............................................................................. 367
ABCs em collections.abc........................................................................... 367
A torre numérica de ABCs......................................................................... 369
Definindo e usando uma ABC........................................................................ 370
Detalhes de sintaxe das ABCs.................................................................... 374
Herdando da ABC Tombola...................................................................... 375
Uma subclasse virtual de Tombola............................................................. 378
Como as subclasses de Tombola foram testadas.............................................. 381
Uso de register na prática............................................................................... 384
Gansos podem se comportar como patos........................................................ 385
Resumo do capítulo....................................................................................... 386
Leituras complementares............................................................................... 389

Capítulo 12 ■ Herança: para o bem ou para o mal.............................................................. 395


Artimanhas da criação de subclasses de tipos embutidos................................ 396
Herança múltipla e ordem de resolução de métodos........................................ 399
Herança múltipla no mundo real....................................................................404
Lidando com herança múltipla....................................................................... 407
1. Faça a distinção entre herança de interface e herança de implementação. 407
2. Deixe as interfaces explícitas com ABCs................................................ 407
3. Use mixins para reutilização de código.................................................. 407
4. Explicite as mixins pelo nome................................................................408
5. Uma ABC também pode ser uma mixin; o contrário não é verdade.........408
6. Não herde de mais de uma classe concreta.............................................408
7. Ofereça classes agregadas aos usuários...................................................409
8. “Prefira composição de objetos à herança de classe.”..............................409
Tkinter: o bom, o ruim e o feio.................................................................. 410
Um exemplo moderno: mixins em views genéricas de Django......................... 411
Resumo do capítulo....................................................................................... 414
Leituras complementares............................................................................... 415

Capítulo 13 ■ Sobrecarga de operadores: o jeito certo........................................................ 419


Básico da sobrecarga de operadores................................................................ 420
Operadores unários....................................................................................... 420
Sobrecarregando + para soma de vetores........................................................ 423
Sobrecarregando * para multiplicação por escalar............................................ 429
Operadores de comparação rica...................................................................... 433
Operadores de atribuição combinada............................................................. 438
Resumo do capítulo....................................................................................... 443
Leituras complementares...............................................................................444
Sumário 13

Parte V ■ Controle de fluxo................................................................................ 449


Capítulo 14 ■ Iteráveis, iteradores e geradores.................................................................. 450
Sentence tomada #1: uma sequência de palavras............................................. 451
Por que sequências são iteráveis: a função iter............................................ 453
Iteráveis versus iteradores............................................................................... 455
Sentence tomada #2: um iterador clássico....................................................... 459
Fazer de Sentence um iterador: péssima ideia.............................................460
Sentence tomada #3: uma função geradora..................................................... 461
Como funciona uma função geradora........................................................ 462
Sentence tomada #4: uma implementação lazy...............................................466
Sentence tomada #5: uma expressão geradora................................................ 467
Expressões geradoras: quando usá-las............................................................ 469
Outro exemplo: gerador de progressão aritmética........................................... 470
Progressão aritmética com itertools........................................................... 473
Funções geradoras na biblioteca-padrão.......................................................... 474
Nova sintaxe em Python 3.3: yield from.......................................................... 485
Funções de redução de iteráveis...................................................................... 486
Uma visão mais detalhada da função iter........................................................ 488
Estudo de caso: geradores em um utilitário para conversão de banco de dados.489
Geradores como corrotinas............................................................................ 491
Resumo do capítulo....................................................................................... 492
Leituras complementares............................................................................... 493

Capítulo 15 ■ Gerenciadores de contexto e blocos else....................................................... 499


Faça isso, então aquilo: blocos else além de if..................................................500
Gerenciadores de contexto e blocos with........................................................ 502
Utilitários de contextlib................................................................................. 507
Usando @contextmanager............................................................................. 508
Resumo do capítulo....................................................................................... 512
Leituras complementares............................................................................... 512

Capítulo 16 ■ Corrotinas................................................................................................... 515


Como as corrotinas evoluíram a partir de geradores........................................ 516
Comportamento básico de um gerador usado como corrotina......................... 517
Exemplo: corrotina para calcular uma média cumulativa................................ 520
Decoradores para preparação de corrotinas.................................................... 522
Término de corrotinas e tratamento de exceção.............................................. 524
Devolvendo um valor a partir de uma corrotina.............................................. 528
Usando yield from......................................................................................... 530
O significado de yield from............................................................................ 536
14 Python Fluente

Caso de uso: corrotinas para uma simulação de eventos discretos................... 543


Sobre simulações de eventos discretos........................................................ 543
A simulação da frota de táxis..................................................................... 544
Resumo do capítulo....................................................................................... 552
Leituras complementares............................................................................... 554

Capítulo 17 ■ Concorrência com futures.............................................................................560


Exemplo: downloads da Web em três estilos................................................... 560
Um script para download sequencial......................................................... 563
Fazendo download com concurrent.futures............................................... 565
Onde estão os futures?.............................................................................. 566
E/S bloqueante e a GIL................................................................................... 570
Iniciando processos com concurrent.futures................................................... 571
Fazendo experimentos com Executor.map...................................................... 573
Downloads com exibição de progresso e tratamento de erros.......................... 576
Tratamento de erros nos exemplos da série flags2 ...................................... 581
Usando futures.as_completed................................................................... 584
Alternativas com threading e multiprocessing............................................ 587
Resumo do capítulo....................................................................................... 587
Leituras complementares............................................................................... 588

Capítulo 18 ■ Concorrência com asyncio............................................................................ 594


Thread versus corrotina: uma comparação..................................................... 596
asyncio.Future: não bloqueante por design................................................ 603
yield from com futures, tasks e corrotinas..................................................604
Fazendo download com asyncio e aiohttp....................................................... 605
Dando voltas em chamadas bloqueantes......................................................... 610
Melhorando o script para download com asyncio .......................................... 612
Usando asyncio.as_completed................................................................... 613
Usando um executor para evitar bloqueio do loop de eventos..................... 619
De callbacks a futures e corrotinas................................................................. 620
Fazendo várias requisições para cada download......................................... 623
Escrevendo servidores com asyncio ............................................................... 626
Um servidor TCP com asyncio .................................................................. 627
Um servidor web com aiohttp ................................................................... 632
Clientes mais inteligentes para melhorar a concorrência............................. 636
Resumo do capítulo....................................................................................... 637
Leituras complementares............................................................................... 638
Sumário 15

Parte VI ■ Metaprogramação............................................................................ 643


Capítulo 19 ■ Atributos dinâmicos e propriedades.............................................................644
Processando dados com atributos dinâmicos.................................................. 645
Explorando dados JSON ou similares com atributos dinâmicos.................. 647
O problema do nome de atributo inválido.................................................. 651
Criação flexível de objetos com __new__................................................... 652
Reestruturando o feed da OSCON com shelve........................................... 654
Recuperação de registros relacionados usando propriedades....................... 658
Usando uma propriedade para validação de atributo....................................... 665
LineItem tomada #1: classe para um item de um pedido............................ 665
LineItem tomada #2: uma propriedade com validação............................... 666
Uma visão apropriada das propriedades......................................................... 667
Propriedades encobrem atributos de instância............................................ 669
Documentação de propriedades................................................................. 672
Implementando uma fábrica de propriedades.................................................. 673
Tratando a remoção de atributos.................................................................... 676
Atributos e funções essenciais para tratamento de atributos............................ 677
Atributos especiais que afetam o tratamento de atributos........................... 677
Funções embutidas para tratamento de atributos....................................... 678
Métodos especiais para tratamento de atributos......................................... 679
Resumo do capítulo....................................................................................... 681
Leituras complementares............................................................................... 681

Capítulo 20 ■ Descritores de atributos...............................................................................687


Exemplo de descritor: validação de atributos.................................................. 687
LineItem tomada #3: um descritor simples................................................ 688
LineItem tomada #4: nomes automáticos para atributos de armazenagem.. 693
LineItem tomada #5: um novo tipo descritor............................................. 700
Descritores dominantes e não dominantes...................................................... 703
Descritor dominante................................................................................. 705
Descritor dominante sem __get__............................................................. 706
Descritor não dominante........................................................................... 707
Sobrescrevendo um descritor na classe....................................................... 709
Métodos são descritores................................................................................. 709
Dicas para uso de descritores......................................................................... 712
Docstring de descritores e controle de remoção............................................... 714
Resumo do capítulo....................................................................................... 715
Leituras complementares............................................................................... 716
16 Python Fluente

Capítulo 21 ■ Metaprogramação com classes..................................................................... 718


Uma fábrica de classes................................................................................... 719
Um decorador de classe para personalizar descritores..................................... 722
O que acontece quando: tempo de importação versus tempo de execução........ 725
Exercícios dos instantes de avaliação......................................................... 726
Básico sobre metaclasses................................................................................ 730
Exercício do instante de avaliação de metaclasses....................................... 732
Uma metaclasse para personalizar descritores................................................. 736
Método especial __prepare__ de metaclasse................................................... 738
Classes como objetos..................................................................................... 741
Resumo do capítulo....................................................................................... 742
Leituras complementares............................................................................... 743

Posfácio........................................................................................................................... 747
Leituras complementares............................................................................... 749

Apêndice A ■ Scripts auxiliares.......................................................................................... 751


Capítulo 3: teste de desempenho do operador in............................................. 751
Capítulo 3: comparar padrões de bits de hashes.............................................. 754
Capítulo 9: uso de RAM com e sem __slots__................................................ 754
Capítulo 14: script isis2json.py para conversão de banco de dados................... 755
Capítulo 16: simulação de eventos discretos para a frota de táxis..................... 761
Capítulo 17: Exemplos com criptografia......................................................... 766
Capítulo 17: exemplos de cliente HTTP para flags2......................................... 769
Capítulo 19: Scripts e testes para agenda da OSCON...................................... 775

Jargão de Python............................................................................................................. 781

Sobre o autor................................................................................................................... 798

Colofão............................................................................................................................ 799

You might also like