Monkey Patch

21/03/2008

Motivado pelos posts sobre paradigmas de programação escritos pelo Ronaldo Ferraz e a uma discussão sobre como alterar uma classe em tempo de execução no Python, resolvi escrever sobre esse assunto aqui no blog.



Moneky Patch é como é chamada a possibilidade de poder alterar uma classe em tempo de execução. Existem linguagens em que o Monkey Patch é muito utilizado, como o Ruby, mas é possível utilizar essa técnica em Python também.



Em Ruby para alterar uma classe basta apenas chamar a classe novamente e assim extendê-la:



Vamos criar uma classe chamada Teste:




class Teste
def oi
puts 'oi'
end
end


Vamos alterar ela. Como citei acima basta apenas recriar ela com o novo método:




class Teste
def ola
puts 'ola'
end
end


Em Ruby é permitido alterar classes nativas e métodos já existentes. Dessa forma se eu quiser adicionar um método a classe String eu posso.




class String
def conta
return self.size()
end
end


Em Python as coisas funcionam um pouco diferente. Vamos criar uma classe sem métodos chamada Teste:




>>>class Teste: pass
>>> dir(Teste)
['__doc__', '__module__']


Vamos criar uma função para adicionar futuramente como método a classe Teste




>>> def oi(self): print 'oi'


Para adicionar essa função como método da classe basta criar um atributo na classe e atribuir a função a esse atributo da seguinte maneira:




>>> Teste.oi = oi


E para confirmar que está tudo funcionando como esperado, vamos criar uma instância para a classe Teste e executar o método oi:




>>> teste = Teste()
>>> teste.oi()
oi


Outra forma de adicionarmos um método a uma classe é usando o método setattr:




>>>setattr(Teste, oi.__name__, oi)


Agora com esse conhecimento é possível, automatizar isso criando decorators ou metaclasses como num exemplo dado pelo Guido van Rossum.



Só uma observação. Diferente de Ruby, no Python não é possivel fazer monkey patch em classes built-in como str, int, list.



Vamos a um exemplo:




>>> def conta(self): print len(self)

>>> setattr(str, conta.__name__, conta)

Traceback (most recent call last):
File "", line 1, in
TypeError: can't set attributes of built-in/extension type 'str'


Para finalizar, ter o recurso do monkey patch numa linguagem é algo muito poderoso, e alguém já disse que 'com grandes poderes, vem grandes responsabilidades'. Se você alterar uma classe usando o monkey patch com um método que já existe nessa classe, isso pode ser algo bem traiçoeiro.



Parabéns para mim

19/03/2008

Bom pessoal hoje dia 20 de março faz 23 anos que eu nasci.



Parabéns para mim!



:-)

Django T-Shirts

10/03/2008

Ter uma camiseta do Django é o sonho de vários desenvolvedores Django aqui no Brasil.



Uma prova disso é uma thread que está rolando na lista do django-brasil para que seja feito uma camiseta. O que muitos não sabem é que já existe o Django T-Shirts, onde há alguns modelos de camisetas e blusas de frio.



Agora é só juntar uma graninha e comprar a sua!


Microsoft Research Asirra

10/03/2008

Eu sempre odiei o uso de CAPTCHA para evitar spam's e comecei a odiar ainda mais quando saiu o re-captcha. Mas eu sempre concordei que eles eram as melhores opções para verificar se uma mensagem ou um comentário está sendo inserido por uma pessoa e não por um programa. Pois é, eles ERAM as melhores opções.



Navegando pelo site da M$ Research encontrei um projeto bem bacana, chamado Asirra. O Asirra é um sistema de verificação de interatividade humana, que é composto de várias fotos de gatos e cachorros onde a pessoa tem que selecionar todos os gatos. Além de ser bem bacaninha a interface do Asirra, é bem mais fácil para um usuário identificar gatos entre cachorros do que tentar reconhecer palavras que muitas vezes são ilegíveis como as que ficam nos sistemas de CAPTCHA.



O Assira assim como o re-Captcha é gratuito e no seu site há vários exemplos de como usar ele com Python, PHP, C#, JScript, VB e Perl.

Python 2.6a1 e 3.0a3 sem conflitos

03/03/2008

Há alguns dias foram lançadas as versões alpha das versões 2.6 e 3.0 do Python.



Se você quiser instalar essas versões para 'brincar' com elas sem interferir nas versões já instaladas no seu computador é bem simples.



Você pode seguir uma 'receitinha' feita pelo Luiz Rocha para instalar o Python no diretório /opt do linux.



Primeiramente baixe os arquivos tar.gz do Python 2.6a1 aqui e do Python 3.0a3 aqui.



Descompacte os arquivos:



Para o Python 2.6


$ tar xvzf Python-2.6a1.tar.gz


e para o Python 3.0


$ tar xvzf Python-3.0a3.tar.gz


Entre no diretório do Python 2.6 e execute os comandos abaixo para instalá-lo.



$ ./configure --prefix=/opt/python26
$ make
$ make install

E agora vamos fazer a mesma coisa para instalar o Python 3.



$ ./configure --prefix=/opt/python3k
$ make
$ make install

Para usá-los é só executar os seguintes comandos:



Para o Python 2.6


$ /opt/python26/bin/python


Para o Python 3


$ /opt/python3k/bin/python


Uma vantagem de instalar essas versões do Python no /opt é a facilidade de poder removê-las usando:




$ rm -rf /opt/python26/bin/python
$ rm -rf /opt/python3k/bin/python
andrewsmedina.com 2010. todos os direitos reservados.