python para quem sabe python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf ·...

33
Python para quem sabe Python Turma 0, aula 4 Metaclasses, programação funcional e programação assíncrona

Upload: others

Post on 10-Oct-2019

15 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Python para quem sabe Python

Turma 0, aula 4

Metaclasses,programação funcional

e programação assíncrona

Page 2: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Exercício: execucao.py

● Para entender como o interpretador Python lê um arquivo .py

● Tudo é executável● Mas às vezes, executar significa “definir,

compilar e atribuir um objeto” (ex. funções e classes)

● O que é preciso executar para definir um desses objetos?

https://github.com/oturing/ppqsp/blob/master/metaprog/execucao.py

Page 3: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Recapitulando: Descritores

Page 4: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Recapitulando:Descritores e metaclasses

Page 5: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Descritor com nome automáticoclass Quantidade(object): def __set__(self, instance, valor): # nome atribuido Just-In-Time, idéia do Gustavo Fonseca [1] if not hasattr(self, 'nome_atr'): for nome, atr in instance.__class__.__dict__.items(): if atr is self: self.nome_atr = '__'+nome break else: # only if the for loop terminates without break assert False, 'descriptor not found in class' if valor < 1: raise TypeError('%s deve ser > 0' % self.nome_atr[2:]) setattr(instance, self.nome_atr, valor)

def __get__(self, instance, owner): return getattr(instance, self.nome_atr)

class C(object): def __init__(self, x): self.x = x x = Quantidade()

[1] http://gusfonseca.wordpress.com/2011/12/11/um-pouco-sobre-descritores-em-python/

Page 6: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

O caminho até metaclasses

● No github.com/oturing/ppsqp [1]● pedido3.py: descritor com nome automático● pedido4.py e pedido5.py:

● primeiro exemplo do atributo __metaclass__● classe abstrata ValidatedDescriptor para facilitar a

criação de novos descritores com validação– uso do padrão Template Method (GoF 325)

[1] https://github.com/oturing/ppqsp/tree/master/atributos/metaclasses

Page 7: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Template Method (GoF 325)

● Auto-delegação (A. Martelli)● Usando Template Method,

uma classe abstrata deixa suas subclasses definirem um ou mais passos de um algoritmo

Page 8: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

O caminho até metaclasses (2)

● pedido6.py: ● registro da ordem dos descritores via

ValidatedDescriptor.__new__● primeiro exemplo do método __new__

Page 9: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 10: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 11: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

O caminho até metaclasses (3)

● pedido7.py: ● metaclasse OrderedModelMeta para criar atributo

_ordered_descriptors em cada nova classe deste tipo● classe OrderedModel para facilitar o uso da metaclasse,

permitindo que as subclasses herdem o atributo __metaclass__ = OrderedModelMeta

● registro da ordem dos descritores movido de ValidatedDescriptor para a nova classe abstrata OrderedDescriptor– separação de responsabilidades: uma classe cuida de

validação, a outra de ordenação

Page 12: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 13: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 14: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

O caminho até metaclasses (4)

● pedido8.py: ● lógica de atribuição de nomes aos descritores movida

para o método __new__ da metaclasse OrderedModelMeta– aproveita o fato de que este método __new__ já tem que

percorrer todos os atributos do dict da nova classe, e evita o custo de fazer um laço a cada __set__ inicial e um teste hasattr em todas as chamadas de __set__

● método list_ordered_descriptors na classe OrderedModel para evitar que as subclasses tenha que acessar o atributo de classe que mantém a lista (_ordered_descriptors)

Page 15: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 16: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 17: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

O caminho até metaclasses (5)

● pedido9.py: ● definição de um __init__ genérico em

OrderedModel que recebe os argumentos posicionais e os atribui em aos atributos ordenados

● desta forma as subclasses de OrderedModel não precisam implementar seus __init__, evitando a repetição dos nomes dos atributos associados aos OrderedDescriptors

Page 18: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Programação funcional

● Paradigma que enfatiza o uso de funções puras, composição de funções, funções de ordem superior e estruturas de dados imutáveis● Funções puras = sem efeitos colaterais: não modificam

seus argumentos nem alteram o estado do sistema de nenhuma maneira, mas apenas devolvem um valor

● Composição de funções: aplicação de uma função ao resultado de uma outra

● Funções de ordem superior: funções que recebem funções como argumentos ou devolvem funções como resultado

Page 19: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Funções como objetos de 1ª classe

● objetos de 1ª classe● ex: números, strings, listas, etc. (até classes em Python)● podem ser construídos em tempo de execução● podem ser atribuídos a variáveis, passados como

argumentos, devolvidos como resultados de funções

● em Python, funções são objetos de 1ª classe● isso ocorre em muitas linguagens modernas, mas não em

Java e nem em Pascal

● em Python, funções são instâncias de function, e têm seus próprios atributos

Page 20: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Funções são objetos de 1ª classe

>>> def dobro(n):... """Devolve duas vezes n"""... return n*2>>> dobro(21)42>>> dobro('X')'XX'>>> dobro<function dobro at 0x990b17c>>>> type(dobro)<type 'function'>>>> x2 = dobro>>> x2(1234)2468>>> map(dobro, [11, 22, 33])[22, 44, 66]

>>> def dobro(n):... """Devolve duas vezes n"""... return n*2>>> dobro(21)42>>> dobro('X')'XX'>>> dobro<function dobro at 0x990b17c>>>> type(dobro)<type 'function'>>>> x2 = dobro>>> x2(1234)2468>>> map(dobro, [11, 22, 33])[22, 44, 66]

função deordem superior

Page 21: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Funções de ordem superior

● Funções que recebem funções como argumento ou devolvem funções como resultado

● Exemplos importantes em Python:● map, filter

– fazem o mesmo que list comprehensions● reduce

– substituído por sum, all e any nos casos mais comuns● sorted, list.sort

– muito úteis

Page 22: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Recursos para programação funcional em Python

● Módulo functools● várias funções de ordem superior

● Módulo itertools● inspirado pelas biblioteca padrão de Haskell, uma

das linguagens funcionais mais “puras”

● Módulo operator● operadores básicos de Python implementados

como funções● muito úteis: attrgetter e itemgetter

Page 23: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Programação asíncrona

Page 24: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Programação assíncrona

● Também conhecida como programação orientada a eventos

● Aplicações: sistemas reativos● reagem a eventos externos● ex: servidores, aplicações GUI, jogos,

controladores embutidos em máquinas

● Na moda por causa do problema C10k● como lidar com 10.000 conexões?

– 10.000 threads não é a resposta certa

Page 25: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Bibliotecas para programação de aplicações de rede assíncronas

● Módulos select, asyncore e asyncchat do Python padrão

● Twisted: 10 anos de história, muitos protocolos, tem uma cultura e terminologia própria, peculiar● baseado em callbacks, com suporte recente a co-

rotinas

● Tornado: recente, mais enxuto que o Twisted● gevent: baseado em co-rotinas● outras opções...

Page 26: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 27: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 28: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 29: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 30: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,
Page 31: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Temas I

● sobrecarga de operadores (ou como fazer uma API Pythonica)

● iteráveis e iteradores (ou como percorrer qualquer coisa com um simples for)

● geradores e co-rotinas (ou outro jeito de organizar meus algoritmos)

Page 32: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Temas II

● acesso, criação e remoção dinânica de atributos (tudo sobre atributos básicos)

● propriedades e descritores (encapsulamento com atributos, ou como funcionam os modelos do Django)

● meta-programação, criação dinâmica de classes e funções (ou monkeypatching)

● metaclasses (ou como explodir sua mente criando classes turbinadas)

Page 33: Python para quem sabe Python - turing.com.brturing.com.br/material/ppqsp/2011/ppqsp_t0a4.pdf · Funções como objetos de 1ª classe objetos de 1ª classe ex: números, strings, listas,

Temas III

● programação funcional (ou aquele outro paradigma que tá na moda)

● decoradores de funções (ou meta-programação com arte)

● programação assíncrona (ou como fazer muitas coisas ao mesmo tempo sem usar threads)

● gerenciadores de contexto (ou como usar o comando with)