Re: [pyar] ¿If anidado?

Página superior
Adjuntos:
+ (text/plain)

Responder a este mensaje
Autor: news
Fecha:  
A: pyar
Asunto: Re: [pyar] ¿If anidado?


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


---------------------------------------------------------------------
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/