2009/9/17 Juan Pedro Fisanotti <fisadev@???>
> El día 17 de septiembre de 2009 13:47, <guagliap@???> escribió:
> >
> >
> > On Thu, 17 Sep 2009 11:56:38 -0300, Claudio Freire <
> klaussfreire@???> wrote:
> >
> >>2009/9/16 Facundo Batista <facundobatista@???>
> >>
> >>> 2009/9/16 Charif Mauricio Nadir <mry.shariff@???>:
> >>>
> >>> > El uso de la sentencia break está considerada como una mala práctica,
> al
> >>> > igual que continue. El flujo de un programa debe ser fácil de seguir
> sin
> >>> > saltos y sin interrumpir el flujo de las estructuras de control.
> >>>
> >>> No estoy de acuerdo.
> >>>
> >>> ...
> >>> while True:
> >>> edad = raw_input(mssg)
> >>> if edad.isdigit():
> >>> break
> >>>
> >>> print "no nro"
> >>>
> >>>
> >>El problema de los while True y los breaks es que hacen el análisis de
> >>correctitud y terminación por invariantes casi imposible.
> >>Están deprecados en el mundo de la programación porque es muy difícil,
> >>leyéndolos, asegurar que no es un loop infinito, y que cuando sale el
> >>invariante (si hay) se cumple.
> >>
> >>Aquí, claro está, realmente podría ser un loop infinito (el usuario nunca
> >>tipea un número), y el único invariante deseado es "edad.isdigit()" -
> >>nuevamente, ese while True hace menos evidente que al salir del loop,
> edad
> >>es en efecto un número.
> >>
> >>Por eso yo propongo:
> >>
> >>edad = None
> >>while edad is None or not edad.isdigit():
> >> edad = raw_input("dale... un numerito...")
> >>
> >>La ventaja: al salir del loop uno sabe:
> >>1) que "edad is not None" (útil)
> >>2) que "edad.isdigit()" (útil)
> >
> >
> > Mi versión (¿vale como "hola mundo", ya que es mi primer post?) :)
> >
> > ----------------
> > import inspect
> >
> > def firstTrue(cond):
> > """ devuelve True siempre la primera vez que se la ejecuta, las veces
> subsiguientes evalua la condicion """
> > stack = inspect.stack()[1] # El stack del programa llamador
> > line = stack[2] # Nro de linea desde la que llame a
> firstTrue
> > del stack
> >
> > if not "line" in firstTrue.__dict__:
> > # Primera vez que llamo a la funcion
> > firstTrue.line = line
> > return True
> > elif firstTrue.line != line:
> > # Llame a la funcion desde otro punto del programa
> > firstTrue.line = line
> > return True
> >
> > return cond
> >
> >
> > edad = "0" # Entra igual la primera vez
> >
> > while firstTrue (not edad.isdigit()):
> > edad = raw_input ("¿Cuantos años tenes? ")
> > if not edad.isdigit():
> > print "No ingresaste un nro!"
> > --------------
> >
> > Aunque no sé si lo usaría en producción, habría que ver si la performance
> es razonable llamando
> > continuamente a inspect.stack.
> >
> > Saludos,
> > Pablo G
> >
>
> Matando una hormiga con un misil nuclear :D
>
>
> --
> fisa - Juan Pedro Fisanotti
>
> ---------------------------------------------------------------------
> Para dar de baja la suscripcion, mande un mensaje a:
> pyar-unsubscribe@???
>
> Para obtener el resto de direcciones-comando, mande un mensaje a:
> pyar-help@???
>
> PyAr - Python Argentina - Sitio web: http://www.python.com.ar/ >
>
>