Automágica: durante 2017 estoy trabajando bastante en Automágica, mi software para editar libros: Más información - Posts relacionados

8 de mayo: Python Day en Rafaela

El próximo sábado se va a desarrollar en la ciudad de Rafaela un Python Day, un día de charlas para que quienes no conozcan Python puedan acercarse al lenguaje. Vamos a tener muchas charlas introductorias y esperamos pueda aprovechar este evento tanto la comunidad universitaria como la ciudad en general.

http://www.pyday.com.ar/rafaela2010/

Por mi parte voy a estar colaborando con una charla nueva: Entendiendo Decoradores en Python. Esperemos salga bien :)

El Python Day es un evento organizado por PyAr con el apoyo de la Universidad Católica de Santiago del Estero, Departamento Académico Rafaela. El evento dura un día donde se darán pequeños cursos y charlas relacionadas a este lenguaje que de a poco va a haciendo su lugar entre los desarrolladores. Tenemos como intención hacer un espacio en donde cualquier persona interesada pueda acercarse para preguntar, aprender y experimentar con estas herramientas. El evento se llevará a cabo acá a partir de las 9:00 de la mañana. ¿Qué es Python? Python es un lenguaje de programación interpretado creado por Guido van Rossum en el año 1990. En la actualidad Python se desarrolla como un proyecto de código abierto, administrado por la Python Software Foundation. La última versión estable del lenguaje es la 2.6 (01 de octubre de 2008). Fuente: Wikipedia Quiero participar… ¿Qué Hago? Si lo que querés es asistir a las charlas, solo aparecete por la universidad el 8 de mayo a partir de las 09:00 y listo (por favor, si es posible, registrate previamente por web)


Aplicar un decorador a todas las funciones de un módulo en Python

En la lista de PyAr preguntaron si había alguna forma de aplicar un decorador a todos las funciones de un módulo. Envié una solución sin probarla, que al verla unos días más tarde parece bastante buena :)

La comento aquí con un ejemplo. modulo.py contiene definiciones de funciones:

def a():
pass

def b():

print 42

def c():

a()

b()</pre>

y decoradores.py un decorador que imprime el nombre de la función llamada:

def nombrador(f):

    def inner(*a, **kw):

        print "Ejecutando %s" % f.__name__

        return f(*a, **kw)

    return inner

(Si no sabés lo que es un decorador, podés leer mi post Decoradores en Python I: Introducción)

En lugar de modificar las definiciones de funciones en modulo.py para aplicar el decorador a cada una de las funciones, ya sea usando el azúcar sintáctica de Python:

@nombrador

def a():

    ...

o mediante una llamada a la función:

a = nombrador(a)

podemos agregar el siguiente código al final de modulo.py:

for n,v in locals().items():

   if inspect.isfunction(v) and n != 'nombrador':

       locals()[n] = nombrador(v)

Vamos a explicarlo:

la llamada a la función built-in locals retorna un diccionario representando el espacio de nombres local: cada clave es un string representando el nombre de un objeto y cada valor es el objeto en si. Iteramos sobre la lista de pares (key, value) del mencionado dict y por cada uno verificamos si:

a) es una función (inspect.isfunction es apropiado para esto)

b) el nombre no es el del decorador que queremos aplicar (para no aplicar el decorador sobre si mismo!)

Si las condiciones a y b se cumplen, podemos guardar en el diccionario del espacio de nombres, bajo el nombre de la función que cumplió las condiciones, una versión decorada de la misma.

Agregamos algo más de código a modulo.py para que se llame a las funciones cuando lo ejecutemos:

if __name__ == '__main__':

    a()

    b()

    c()

Esta es la salida obtenida:

juanjo@fenix:~/python/muchosdecos$ python modulo.py

Ejecutando a

Ejecutando b

42

Ejecutando c

Ejecutando a

Ejecutando b

42

¿Querés probarlo? Bajá muchos.zip

Nota: para acceder a locals() no se puede utilizar iteritems por que el diccionario cambia durante la ejecución.



4 de Octubre - 3ra Jornada Python en Santa Fe

El próximo 4 de Octubre se llevará a cabo en instalaciones de la Universidad Tecnológica Nacional, Facultad Regional Santa Fe, la 3ra Jornada Python en Santa Fe [1]. Orientadas a programadores y profesionales de sistemas, estudiantes y público en general interesado en la programación, los invitamos a participar registrándose en nuestra web [2]. La asistencia es libre y gratuita.

Esta jornada consiste en una serie de charlas relacionadas con el lenguaje de programación Python. Ya está disponible el programa del evento [3].

¿Qué es Python?

Python es un lenguaje de programación interpretado, dinámico y orientado a objetos que puede ser utilizado en diferentes desarrollos de software y en múltiples plataformas. La característica de ser multiplataforma es algo muy interesante para los desarrolladores. El lenguaje se encuentra soportado en Unix, GNU/Linux, Widows/DOS, Macintosh… y la lista sigue. Desde grandes mainframes a pequeñas Palm. En la web oficial [4] del lenguaje encontrará mayor información y mucha documentación.

Y en el país existe una comunidad de desarrolladores muy fuerte, agrupada en PyAR, Python Argentina [5].

¿Quién utiliza Python?

La NASA, Google, Yahoo, Walt Disney y Red Hat son algunas de las grandes organizaciones que trabajan con este lenguaje. Google contrató a su creador, Guido van Rossum. En la mayoría de las distribuciones GNU/Linux encontramos Python ya instalado (se usa mucho como lenguaje de script para automatizar tareas). Y en el país también hay numerosas empresas que trabajan con Python: Lunix, Except, Lambda Sistemas, etc.

Recuerden registrarse [2] y los esperamos el 4 de Octubre!

[1] Web de la jornada: www.pythonsantafe.com.ar

[2] Registración: www.pythonsantafe.com.ar/registracion

[3] Programa: www.pythonsantafe.com.ar/programacion

[4] Web del lenguaje: www.python.org

[5] PyAR: www.python.com.ar


Destapando las cañerías de planet-planet

Palabras claves: planet-planet exception KeyError

Antes de venirme para Pellegrini recibí algunos avisos de que los planetas de PyAr y TecnoFe no se estaban actualizando. Estos dos sitios corren sobre dos instalacions de planet-planet, un agregador de feeds escrito en Python. El programa consiste en un script que cada vez que se ejecuta genera páginas html, actualizando su contenido entre corrida y corrida si corresponde.

Mediante reglas de cron hago que estos scripts corran cada 15 minutos, buscando novedades en los blogs agregados.

Mi primer intento de saber qué estaba pasando fue revisar crontab, pero no encontré nada raro allí. Lo siguiente fue ejecutar a manos los scripts en cuestión. Ambos tiraban exepciones similares:

Traceback (most recent call last):

File "planet.py", line 167, in ?

main()

File "planet.py", line 160, in main

my_planet.run(planet_name, planet_link, template_files, offline)

File "/home/.orithyia/jjconti/pyar.firebirds.com.ar/planet-2.0/planet/init.py", line 240, in run

channel = Channel(self, feed_url)

File "/home/.orithyia/jjconti/pyar.firebirds.com.ar/planet-2.0/planet/init.py", line 527, in init

self.cache_read_entries()

File "/home/.orithyia/jjconti/pyar.firebirds.com.ar/planet-2.0/planet/init.py", line 569, in cache_read_entries

item = NewsItem(self, key)

File "/home/.orithyia/jjconti/pyar.firebirds.com.ar/planet-2.0/planet/init.py", line 845, in init

self.cache_read()

File "/home/.orithyia/jjconti/pyar.firebirds.com.ar/planet-2.0/planet/cache.py", line 74, in cache_read

self._type[key] = self._cache[cache_key + " type"]

File "/usr/lib/python2.3/bsddb/init.py", line 116, in getitem

return self.db[key]

KeyError: 'tag:www.taniquetil.com.ar,2007-08-31:285 author type'

Este software tiene un cache de informacion para guardar los feeds que parsea. Basicamente es un directorio llamado cache con un archivo por cada feed agregado.

Solucioné el problema -más por instinto que por pericia- borrando, para ambos sitios, el archivo correspondiente al blog con problemas. Les dejo el tip por si les sucede en alguna instalación de planet-planet. Prometo que si me vuelve a pasar voy a investigar un poquito más para descubrir la razón del problema :)


Código Secreto (juego)

Una tarde estábamos jugando a este juego en su tablero y me dieron ganas de jugarlo en la compu también. Una búsqueda rápida no nos arrojó resultados y decidí programarlo para practicar mi PyGame. La idea fue no terminar con algo muy complejo, sino más bien simple que pueda programarlo rápido y que sirva también como ejemplo de uso de esta librería.

El juego es un juego lógico: hay que pensar para poder ganar ;-).

Para jugarlo pueden obtener la última versión desde el svn:

svn co http://svn.juanjoconti.com.ar/code/ SecretCode

A pedido de Lucio de PyAr dejo unas capturas de pantalla, espero que alcancen para entender el juego. Si no se entiende, podemos usar los comentarios de este post para aclarar dudas :).

Menú

Secret Code-Menu

Las reglas

Pantallazo-Secret Code-Reglas

Jugando

Secret Code-Jugando

Una jugada ganadora

Secret Code-Ganando

Créditos

Secret Code-Creditos