Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: 0x5d en 26 Abril 2012, 23:01 pm



Título: [Python]Técnicas para reducir código JaAViEr|0x5d
Publicado por: 0x5d en 26 Abril 2012, 23:01 pm
Hola, buen día !
No encontré un mejor título XD, pero aquí voy...
En esta oportunidad pretendo seguir fomentando la reducción de código, aunque sea por unos cuantos caracteres, las formas que explicaré quizás no sean tan útiles para reducir mucho el source, pero si podrían usarlo para ofuscar códigos :P.

Bien, al grano ! . Como bien sabemos, hay varias funciones internas en nuestro amado Python, tales
como : int(), str(), raw_input(), input(), etc...

Entre esa lista podemos incluir nuestras funciones creadas vía "def". Bien, pero eso que tiene de
especial ? , ahora vamos a eso ...

Pondré un caso bien sencillo con el uso de def():
Código
  1. def funcion(parametro):
  2. print parametro
  3.  
  4. func = funcion
  5. print func
  6.  
Veremos que la salida es:
Código:
<function funcion at 0xb74a2454>
Bueno y eso qué dirán ustedes :P , aquí viene lo entretenido. Podemos insertar nuestra función dentro de una variable cualquiera y a partir de ese momento podemos llamar a dicha función por
el nombre de la variable... No se entiende ? , un ejemplo:
Código
  1. def funcion_sumar(primero, segundo):
  2. return primero+segundo
  3.  
  4. sumando = funcion_sumar
  5. print "Resultado:",sumando(1,2)
Salida:
Código:
Resultado: 3
Lo mismo podemos aplicar con las anteriores funciones mencionadas. Yo sinceramente la utilidad que le veo es más que nada para la ofuscación de códigos o para utilizar menos carácteres en
nuestro código, cuando llamamos muchas veces a la función.

 Bien, otra forma singular de llamar funciones podría ser insertar nuestras funciones en un diccionario, para quienes no saben a que me refiero con un diccionario:
 
Código
  1. diccionario = {"variable":valor}
Un sencillo ejemplo para que vean a que me refiero:
 
Código
  1. funciones = {"alfa":raw_input,"nums":input}
  2. print funciones['alfa']("Texto ::>")
  3. print funciones['nums']("Numero ::>")
  4.  
Bien, es una manera diferente, pero no es la mejor para optimizar nuestros códigos...
Una forma similar, pero más corta sería:
Código
  1. alfa, nums = (raw_input, input)
  2. print alfa("Texto ::>")
  3. print nums("Numero ::>")
Eso quiere decir que alfa = raw_input() y nums = input()

Lo bueno de esto es que no nos limita a solo usarlo con Python en Consola, podemos aplicarlo por
ejemplo al hermoso PyQT4, por ejemplo, para no tener que escribir QtGui.QPushButton("Valor",self)
cada vez que creamos un botón, o para no tener que escribir QtGui.QLabel("Valor",self) por cada
label, tampoco tener que escribir QtGui.QLineEdit("Valor",self) por cada LineEdit en el formulario.

Podemos usar las siguientes líneas:
Código
  1. label, inpt, boton =(QtGui.QLabel,QtGui.QLineEdit,QtGui.QPushButton)
Por lo que luego de eso para crear un QtGui.QLabel(); solo debemos llamarlo así:
Código
  1. label("New Label", self)
De igual forma es aplicable para cada elemento, también podríamos utilizarlo para ofuscar códigos en PyQT4, pero a eso si que no le veo más utilidad que proteger nuestro source QT4, un ejemplo
de lo que digo en PyQT4:
Código
  1. # -*- coding: utf-8 -*-
  2. # Autor : 0x5d ~> JaAViEr
  3. # Sitio Web ~> www.codigo.ga
  4. # Twitter ~> @javieresteban__
  5.  
  6. from PyQt4 import QtGui, QtCore
  7. import sys
  8.  
  9. class testeo(QtGui.QWidget):
  10.  def __init__(self, parent=None):
  11.    QtGui.QWidget.__init__(self, parent)
  12.    self.setWindowTitle("Bin to Dec | 0x5d")
  13.    label, inpt, boton =(QtGui.QLabel,QtGui.QLineEdit,QtGui.QPushButton)
  14.    self.label_binario = label("Binario :", self).setGeometry(2,15,59,17)
  15.    self.input_binario = inpt(self)
  16.    self.input_binario.setGeometry(60,10,230,27)
  17.    self.label_resultado = label("Resultado :", self).setGeometry(2,50,80,17)
  18.    self.input_salida = inpt(self)
  19.    self.input_salida.setGeometry(80,43,210,27)
  20.    self.input_salida.setReadOnly(True)
  21.    self.boton_limpiar = boton("Limpiar campos", self)
  22.    self.boton_limpiar.setGeometry(1,75,140,27)
  23.    self.boton_convertir = boton("Convertir", self)
  24.    self.boton_convertir.setGeometry(145,75,140,27)
  25.    self.connect(self.boton_limpiar, QtCore.SIGNAL("clicked()"), self.clear_inputs)
  26.    self.connect(self.boton_convertir, QtCore.SIGNAL("clicked()"), self.conversor)
  27.  
  28.  def clear_inputs(self):
  29.    self.input_binario.setText("")
  30.    self.input_salida.setText("")
  31.  
  32.  def conversor(self):
  33.    numero = str(self.input_binario.text())
  34.    t = 0
  35.    for i,h in zip(numero[::-1],range(0,len(numero))): t+=int(i)*2**int(h)
  36.    self.input_salida.setText(str(t))
  37.  
  38. app = QtGui.QApplication(sys.argv)
  39. form = testeo()
  40. form.show()
  41. app.exec_()
  42.  
Espero sea de su agrado el artículo :) !

Fuente : http://codigo.ga/python/python-tecnicas-reduccion-y-ofuscacion-de-codigo/

Saludos, Javier !