SlideShare uma empresa Scribd logo
Metaprogramação 

em Python
@evandrolg
Sobre mim
• Evandro Leopoldino Gonçalves, 28
• @evandrolg (Github, Twitter, Medium, etc)
• Eventer - http://www.eventer.com.br
• Pegasus.lua - http://evandrolg.github.io/
pegasus.lua/
Metaprogramação?
• Escrever programas para ler, gerar ou transformar
outros programas e modificar ele mesmo
• Escrever código que manipula as construções da
linguagem (classes, funções, variáveis de
instancia, módulos)
• Código que manipula código!
Exemplos
• Compilador ou interpretador de linguagem
• Função Eval em linguagens dinâmicas
Python básico
• Em Python tudo é um objeto

(Classes, funções, tipos, módulos)
• Os objetos tem métodos mágicos

(obj.__new__, obj.__prepare__)
• Python tem suporte a closures
• Desde a versão 3, Python tem suporte a
annotations
Reflection
• É a habilidade de um programa analisar e executar
a estrutura de um programa em runtime
• class MyClass(object):

def method(self):

return 'my method!'



obj = globals()['MyClass']()

getattr(obj, 'method')
Decorators
• É uma função wrapper de outra função
• def my_first_decorator(func):

def wrap():

return ‘<p>%s</p>’ % func()

return wrap

• @my_first_decorator

def get_name():

"""" Returns my name """

return 'Evandro'



print(get_name())

# <p>Evandro</p>



print(get_name.__name__)

# wrap



print(get_name.__doc__)

# None
• from functools import wraps



def my_first_decorator(func):

@wraps(func) 

def wrap():

return ‘<p>%s</p>’ % fn()

return wrap

• print(get_name.__name__)

# get_name



print(get_name.__doc__)

# Returns my name
• def changelist(func):

def wrap(self, request, *args, **kwargs):

model = self.model

if not has_permission(request, model):

raise Exception() 

if re.search('^/e/(w+)/(w+)/$', request.path):

return func(self, request)

.filter(event=request.GET[‘e’])

return func(self, request)

return wrap
• @changelist

def get_queryset(self, request):

query = super(TaskAdmin,
self).get_queryset(request)

return query
Properties
• class Person:

name = property()



@name.getter

def name(self):

return self._name



@name.setter

def name(self, value):

if not isinstance(value, str):

raise TypeError('Expected a string')

self._name = value
Inspect
• from inspect import signature



def type_check(func):

def wrap(*args, **kwargs):

for key, param in enumerate(signature(func).parameters.values()):

if not isinstance(args[key], param.annotation):

raise Exception('Expected %s type and %s received ' 

% (type(args), param.annotation))



return func(*args, **kwargs)

return wrap
• @type_check

def mul(x: int, y: int):

return x * y
Metaclass
• Em Python, uma classe é um outro objeto, ou seja
é a instancia de alguma coisa: uma metaclasse!
• Metaclasse é uma instancia de type
• def method(self):

print(‘My method!’)



MyClass = type(‘MyClass’, (), dict(method=method))



m = MyClass()

m.method()

# My method!
• from inspect import isfunction

from datetime import datetime



class Logger(type):

def __init__(self, namespece, bases, attributes):

for key in attributes:

func = attributes[key]



if isfunction(func):

print(func.__name__, datetime.now())
• class Person(metaclass=Logger):

def speak(self, message):

print(message)



def walk(self):

print(‘walking…’)



person = People()



person.speak('hello world!')

# speak 2015-08-23 22:53:11.615184 (<__main__.People object at 0x1006000b8>,
'hello world!')

# hello world!



person.walk()

# run 2015-08-23 22:53:11.615947 (<__main__.People object at 0x1006000b8>,)

# walking…

Obrigado! :)
Evandro Leopoldino Gonçalves

@evandrolg

Mais conteúdo relacionado

Semelhante a Metaprogramming

Scala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetosScala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetos
Felipe Hummel
 
Python2.5.ppt
Python2.5.pptPython2.5.ppt
Python2.5.ppt
wildcat9335
 
Meta-programacao em python
Meta-programacao em pythonMeta-programacao em python
Meta-programacao em python
Tiago Albineli Motta
 
Php5 e a orientação a objetos
Php5 e a orientação a objetosPhp5 e a orientação a objetos
Php5 e a orientação a objetos
xbacon
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
Rildo Pragana
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011
JogosUnisinos
 
AULA 1 - Classes e Objetos.ppt
AULA 1 - Classes e Objetos.pptAULA 1 - Classes e Objetos.ppt
AULA 1 - Classes e Objetos.ppt
JoberthSilva
 
AULA 1 - Classes e Objetos com codigicação Java.ppt
AULA 1 - Classes e Objetos com codigicação Java.pptAULA 1 - Classes e Objetos com codigicação Java.ppt
AULA 1 - Classes e Objetos com codigicação Java.ppt
JoberthSilva
 
PowerShell
PowerShellPowerShell
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
Rafael Cassau
 
Aula 4 php
Aula 4 phpAula 4 php
Aula 4 php
sergio_henrique
 
Funcao PHP
Funcao PHPFuncao PHP
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
Stephen Chin
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
Sérgio Santos
 
Aula5
Aula5Aula5
Aula5
fkimura
 
JADE+JENA
JADE+JENAJADE+JENA
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em Python
Luciano Ramalho
 
java_avancado.pdf
java_avancado.pdfjava_avancado.pdf
java_avancado.pdf
GersonZavala2
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
George Mendonça
 
Aula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIAula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites II
info_cimol
 

Semelhante a Metaprogramming (20)

Scala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetosScala: unindo programação funcional e orientação a objetos
Scala: unindo programação funcional e orientação a objetos
 
Python2.5.ppt
Python2.5.pptPython2.5.ppt
Python2.5.ppt
 
Meta-programacao em python
Meta-programacao em pythonMeta-programacao em python
Meta-programacao em python
 
Php5 e a orientação a objetos
Php5 e a orientação a objetosPhp5 e a orientação a objetos
Php5 e a orientação a objetos
 
Palestra cbq
Palestra cbqPalestra cbq
Palestra cbq
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011
 
AULA 1 - Classes e Objetos.ppt
AULA 1 - Classes e Objetos.pptAULA 1 - Classes e Objetos.ppt
AULA 1 - Classes e Objetos.ppt
 
AULA 1 - Classes e Objetos com codigicação Java.ppt
AULA 1 - Classes e Objetos com codigicação Java.pptAULA 1 - Classes e Objetos com codigicação Java.ppt
AULA 1 - Classes e Objetos com codigicação Java.ppt
 
PowerShell
PowerShellPowerShell
PowerShell
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
Aula 4 php
Aula 4 phpAula 4 php
Aula 4 php
 
Funcao PHP
Funcao PHPFuncao PHP
Funcao PHP
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
 
Aula5
Aula5Aula5
Aula5
 
JADE+JENA
JADE+JENAJADE+JENA
JADE+JENA
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em Python
 
java_avancado.pdf
java_avancado.pdfjava_avancado.pdf
java_avancado.pdf
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
 
Aula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIAula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites II
 

Metaprogramming

  • 2. Sobre mim • Evandro Leopoldino Gonçalves, 28 • @evandrolg (Github, Twitter, Medium, etc) • Eventer - http://www.eventer.com.br • Pegasus.lua - http://evandrolg.github.io/ pegasus.lua/
  • 4. • Escrever programas para ler, gerar ou transformar outros programas e modificar ele mesmo • Escrever código que manipula as construções da linguagem (classes, funções, variáveis de instancia, módulos) • Código que manipula código!
  • 5. Exemplos • Compilador ou interpretador de linguagem • Função Eval em linguagens dinâmicas
  • 6. Python básico • Em Python tudo é um objeto
 (Classes, funções, tipos, módulos) • Os objetos tem métodos mágicos
 (obj.__new__, obj.__prepare__) • Python tem suporte a closures • Desde a versão 3, Python tem suporte a annotations
  • 8. • É a habilidade de um programa analisar e executar a estrutura de um programa em runtime
  • 9. • class MyClass(object):
 def method(self):
 return 'my method!'
 
 obj = globals()['MyClass']()
 getattr(obj, 'method')
  • 11. • É uma função wrapper de outra função
  • 12. • def my_first_decorator(func):
 def wrap():
 return ‘<p>%s</p>’ % func()
 return wrap

  • 13. • @my_first_decorator
 def get_name():
 """" Returns my name """
 return 'Evandro'
 
 print(get_name())
 # <p>Evandro</p>
 
 print(get_name.__name__)
 # wrap
 
 print(get_name.__doc__)
 # None
  • 14. • from functools import wraps
 
 def my_first_decorator(func):
 @wraps(func) 
 def wrap():
 return ‘<p>%s</p>’ % fn()
 return wrap

  • 16. • def changelist(func):
 def wrap(self, request, *args, **kwargs):
 model = self.model
 if not has_permission(request, model):
 raise Exception() 
 if re.search('^/e/(w+)/(w+)/$', request.path):
 return func(self, request)
 .filter(event=request.GET[‘e’])
 return func(self, request)
 return wrap
  • 17. • @changelist
 def get_queryset(self, request):
 query = super(TaskAdmin, self).get_queryset(request)
 return query
  • 19. • class Person:
 name = property()
 
 @name.getter
 def name(self):
 return self._name
 
 @name.setter
 def name(self, value):
 if not isinstance(value, str):
 raise TypeError('Expected a string')
 self._name = value
  • 21. • from inspect import signature
 
 def type_check(func):
 def wrap(*args, **kwargs):
 for key, param in enumerate(signature(func).parameters.values()):
 if not isinstance(args[key], param.annotation):
 raise Exception('Expected %s type and %s received ' 
 % (type(args), param.annotation))
 
 return func(*args, **kwargs)
 return wrap
  • 22. • @type_check
 def mul(x: int, y: int):
 return x * y
  • 24. • Em Python, uma classe é um outro objeto, ou seja é a instancia de alguma coisa: uma metaclasse! • Metaclasse é uma instancia de type
  • 25. • def method(self):
 print(‘My method!’)
 
 MyClass = type(‘MyClass’, (), dict(method=method))
 
 m = MyClass()
 m.method()
 # My method!
  • 26. • from inspect import isfunction
 from datetime import datetime
 
 class Logger(type):
 def __init__(self, namespece, bases, attributes):
 for key in attributes:
 func = attributes[key]
 
 if isfunction(func):
 print(func.__name__, datetime.now())
  • 27. • class Person(metaclass=Logger):
 def speak(self, message):
 print(message)
 
 def walk(self):
 print(‘walking…’)
 
 person = People()
 
 person.speak('hello world!')
 # speak 2015-08-23 22:53:11.615184 (<__main__.People object at 0x1006000b8>, 'hello world!')
 # hello world!
 
 person.walk()
 # run 2015-08-23 22:53:11.615947 (<__main__.People object at 0x1006000b8>,)
 # walking…

  • 28. Obrigado! :) Evandro Leopoldino Gonçalves
 @evandrolg