jueves, julio 19, 2007

este post es para vos...

ponedor de raises compulsivo

alguien con acceso al svn de emesene que no se quien es tiene la bendita constumbre de llenar el codigo de

raise ExcepcionReEspecificaHermosamenteHeredadaDeException( 'mensaje' )

¿alguno por ahi preguntara que tiene de mal eso?

bueno, desde mi punto de vista las siguientes cosas:

1) las excepciones no deberian pasar!:
si, exactamente, una excepcion se llama excepcion justamente por eso!, porque es algo que pasa pocas veces, no una vez cada 5 lineas en el codigo

veamos que dice la rae:

excepción.

(Del lat. exceptĭo, -ōnis).

1. f. Acción y efecto de exceptuar.

2. f. Cosa que se aparta de la regla o condición general de las demás de su especie.



se aparta de la regla!, no es como un if que lo necesitas, es para circunstancias que no podes controlar, como por ejemplo que estas leyendo de un socket y se corte la coneccion o algo asi, no que un parámetro no te gusto como venia.

ejemplo claro en el código:

esta persona esparció todo el modulo de manejo de contactos con estas preciosas excepciones, por ejemplo, si queres borrar un grupo que no existe EXCEPCION, si queres mover un usuario a un grupo que no existe EXCEPCION, si queres borrar un usuario que no existe EXCEPCION, y un millón mas.

vamos a analizar estas situaciones desde la perspectiva de un programador en C que no tiene excepciones, esta "pobre persona carente de una herramienta tan valiosa" diría:

- queres borrar un grupo que no existe? ok, no lo borro, si total no existe
- queres mover un usuario a un grupo que no existe? ok, no lo muevo

y así, si es ya un supremo guru de la programación le dará un mensaje de error al usuario y un debug por ahí para que el desarrollador se fije si no es su culpa.

2) si vas a lanzar una excepcion usa try catch!

lanzar excepciones es complemento de atraparlas, si tenes una retorcida adicción a lanzar excepciones haceme el favor de atraparlas, y si la vas a atrapar hace algo útil, no vale atraparla y no hacer nada, porque te apuesto $5 que es nada que hiciste causa una excepción 5 lineas mas abajo, tampoco vale atrapar la excepción mas genérica, o hacer una especie de:


try:
correrPrograma()
except Exception, ex:
print 'algo paso: ' + str( ex )


porque con eso no hacemos nada...

3) las excepciones no atrapadas cierran el programa, y eso para el usuario final es "tu programa se me colgó":

eso es malo, mientras vos decís "yo hice lo políticamente correcto, si vos ingresas una cantidad que no es un numero lanzo una CantidadFormatException", y ahí esta el problema, la solución no es una excepción, es un mensaje de error o un valor por defecto..

tenia mas números en mente pero ya me cansé, voy a commitear la versión del modulo sin excepciones.. :D

PD: para el desarrollador que hizo eso, no se sienta ofendido, solo considere mis anotaciones :D

lunes, julio 16, 2007

2^7 posts


import gobject
import thread

class Function( object ):
'''a class that represent a function that will run
on a thread and call a callback with the return value'''

def __init__( self, function, callback ):
self.function = function
self.callback = callback
self.queue = Queue.Queue( 0 )

def __call__( self, *args ):
'''when the object is called we start a thread
with the function and parameters and start the
check function that check every 0.2 seconds if
the thread has ended (there is something in the
queue), then call the callback with the result'''

thread.start_new_thread( self._function, args )
gobject.timeout_add( 200 , self.check )

def _function( self, *args ):
'''our function call the parameter function
with the args and put the return value in the
queue'''

self.queue.put( self.function( *args ) )

def check( self ):
'''check there is something in the queue
that means that self.function has ended
then call the callback with the result'''

try:
result = self.queue.get( True, 0.01 )
self.callback( result )
return False
except Queue.Empty:
return True

if __name__ == '__main__':
import time

def funcion(a,b):
time.sleep(5)
return a+b

def callback( suma ):
print suma

f = Function( funcion, callback )
f( 2,3 )
import gtk
gtk.main()


una clase que escribi que basicamente permite hacer que una clase se comporte como una funcion, con el adicional de que corre la funcion en un thread aparte y al terminar llama a la funcion callback pasandole el return como parametro.

util para funciones que demoran mucho para evitar bloquear otras cosas (como el refresco de la interfaz grafica)

si no contamos los comentarios esa clase debe tener 15 lineas, pero el resultado es que nos olvidamos de los threads :)

sábado, julio 14, 2007

its evolution baby

un episodio de evolución acelerada fue detectado en un sapo gigante australiano, que en sólo 70 años ha desarrollado patas más grandes para poder colonizar territorio virgen. Además, sus propios cambios propiciaron una modificación en las mandíbulas de las serpientes del país para que estos sapos pudieran servirle de alimento.

(por si no lo notaron, el titulo es una cancion de perl jam)

Ayreon - Day Eighteen: Realization



pedaso de cancion, no hay nada mas que decir.

viernes, julio 13, 2007

Heaven and hell

Heaven is where the Police are British, the Chefs are French, the Mechanics are German, the Lovers Italian and it's all organised by the Swiss.
Hell is where the Chefs are British, the mechanics are French, the lovers are Swiss, the Police are German and it's all organised by the Italians

como se nota que no conocen a los argentinos... :D

sábado, julio 07, 2007

maldita autocomplesion

El usuario intenta entrar a panoramio.com.
Se dirige a la barra de direcciones con la intención de lograr su objetivo e ingresa la letra p,
firefox gentilmente sugiere el sitio panfletoufa.blogspot.com
el (perturbado?) usuario lee panflauta.blogspot.com

es para preocuparme?

miércoles, julio 04, 2007

AttributeError

you will never understand:
me ense#abas GTK?
mariano guerra:
en un pasado remoto?
you will never understand:
AutoMessage: -vuelvo mas tarde -
puede ser condicional
si lo miras de entre ojos
mariano guerra:
de reojo se parece una ventana de emesene
you will never understand:
desde aca parece de gaim
*se vende*
mariano guerra:
*le da una puñalada en su inexistente alma*
you will never understand:
la pu#alada se la vas a tener que dar a los de gaim
por que se las vendi a ellos
mariano guerra:
vendiste mi alma?
el le y el su son reflexivos
you will never understand:
si, ala bart
mariano guerra:
maldita ambiguedad castellana
you will never understand:
no, esta bie
n*
estas hablando en tercera persona
mariano guerra:
en python seria algo asi como self.givePuñalada( self.getSoul() )
you will never understand:
claro
mariano guerra:
AttributeError: 'Human' object has no attribute 'soul'
you will never understand:
en php seria algo como
$pu#alada = $this->pu#alada
$this->addPu#alada($pu#alada)
no, flashie cualquiera
mariano guerra:
tu php es lamentable
you will never understand:
me marié
no, dejame pensarlo
$this->givePu#alada($this->soul)
pero yo lo queria hacer mas chiflado
mariano guerra:
mariano@war:~/proyectos/emesene$ echo "voy" $(echo "74-53" | bc ) "paginas y me faltan" $( echo "91-74" |bc ) "paginas para terminar"
voy 21 paginas y me faltan 17 paginas para terminar

Seguidores

Archivo del Blog