Willyfrog

Cargando modulos dinámicamente en la botella

Estoy algo liado montando una api para un pequeño proyecto mio, buscando que sea lo más cercano a RESTFUL por motivos laborales y por aprender cosas nuevas (entremedias estoy probando Emacs, que me esta costando un rato el cambio desde Vim).

Como framework estoy usando bottle, ya que siempre estoy usando Flask y quería probar otro distinto a ver qué tal. Y más adelante intentaré montarlo de manera asíncrona, pero eso para más adelante.

Como digo, es una primera aproximación, imagino que el código final tendrá una pinta muy diferente, pero para alguien que quiera cargar dinámicamente los módulos y tratar de ejecutar las funciones es un buen punto de continue.

Des/activando virtualenv automaticamente

Algo que no se me habia ocurrido hasta que mi compañero me lo comentó es la activación automática del entorno virtualenv nada más entrar en el propio directorio, de esta manera ahorramos tiempo y problemas de no estar en el virtualenv apropiado.

Buscando un poco por la red, encontré este gist donde hacía parte de lo que queria, ya que no terminaba el virtualenv al abandonar el directorio, por lo que podria dar problemas al seguir en la misma linea de comandos y ejecutar otras cosas. De ahí que modificara el script para que al abandonar el directorio desactivara el entorno.

Para poder utilizarlo se puede poner el entorno continue.

Receta para introspeccion en python

Al final no me ha servido ya que hay varias propiedades que no son legibles en el codigo legacy que estoy mirando, pero por si a alguien le sirviera copio una receta vista en SO para ver los contenidos de un objeto:

Original:diveintopython
Author:Mark Pilgrim (mark@diveintopython.org)
def info(object, spacing=10, collapse=1):
   """
   Print methods and doc strings.
   Takes module, class, list, dictionary, or string.
   """

    methodList = [e for e in dir(object) if callable(getattr(object, e))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambdas: s)
    print "\\n".join(["%s %s" %
 
continue.

Snipet: Generador de etiquetas

Para poder generar automaticamente etiquetas para nodos (aunque valdria para cualquier otra cosa) he hecho un generador automatico sencillo que va dando strings de texto:

def generador_etiquetas(self):
    '''genera etiquetas,primero minusculas, luego mayusculas y finalmente
    digitos'''
    for a in string.lowercase:
        yield a
    for A in string.uppercase: #cuando termina con las minusculas, pasa a las
                             #   
continue.

Calculo de numeros primos

En un problema que resolvi recientemente en el proyecto euler, descubrí un algoritmo sencillo para calcular numeros primos: la criba de eratóstenes El cual inicialmente traduje a python como:

1 def eratostenes(m):
2     primos = set(range(2,m+1))
3     for i in xrange(2,int(sqrt(m))+1):
4         if i in primos:
5             for j in xrange(2,m/i+1):
6                 primos.discard(i*j)
7 
8     return primos

No comento el código por continue.

Salpimentar al gusto la contraseña

Actualmente estoy trabajando en un prototipo de aplicación bastante sencillo, pero que requiere que aprenda bastantes cosas (y por lo tanto voy algo lento). Uno de los pequeños problemas con los que me enfrenté fue la creación de un sistema de usuarios y no quería dejar el password en abierto en la base de datos aun cuando solo fuera a utilizarlo yo.

Echando un ojo al módulo crypt de Python, requería un poco de sal, por lo que me vi de repente con que no quería meter la sal ni en un fichero de configuración ni obviamente en el código fuente. Por lo que finalmente decidí que la sal continue.

Música en una línea de codigo, versión Python

El otro día vi en reddit algunos temas en los cuales se creaba música a partir de una línea de código (en realidad algo mas, pero la parte importante estaba solo en una) y como curiosidad personal, decidí hacer una versión serpentina de dicho programa, una vez conseguido (fácil, rápido y feo) quise poner un poco mas interés y utilizar funciones lambda y generadores. El resultado es el siguiente:

#redirigir el output a /dev/audio o instalar sox y redirigir a
# "play -u -b 8 -t raw -r 8000 -" sin las comillas

#modificar la parte interna de la funcion int() para variar la "melodia"
func = lambda t: 
continue.