SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
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 objetosFelipe Hummel
 
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 objetosxbacon
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011JogosUnisinos
 
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.pptJoberthSilva
 
AULA 1 - Classes e Objetos.ppt
AULA 1 - Classes e Objetos.pptAULA 1 - Classes e Objetos.ppt
AULA 1 - Classes e Objetos.pptJoberthSilva
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na práticaRafael Cassau
 
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 - BrazilStephen Chin
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em PythonLuciano Ramalho
 
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 IIinfo_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 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
 
AULA 1 - Classes e Objetos.ppt
AULA 1 - Classes e Objetos.pptAULA 1 - Classes e Objetos.ppt
AULA 1 - Classes e Objetos.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