[pyar] [Consulta] Instrucción assert

Apokalyptica Painkiller apokalyptica79 en gmail.com
Mie Jun 12 14:00:42 ART 2013


Buenísimo Pedro, gracias


El 12 de junio de 2013 13:53, Pedro Jose Pezzarini <jose2190 en gmail.com>escribió:

> Totalmente de acuerdo @Santiago Basulto. Creo que el punto medio, es ser
> lo más proximo al determinismo posible.
>
> Yo utilizo mucho asserts mediante una validación por heredado, o mediante
> relación de métodos por un manipulador, en los puntos críticos de un
> sistema.
>
> Entonces podés habilitar/deshabilitar el manejo de assert en todo el
> sistema con un cambio de estado (mediante herencia, obviamente teniendo
> control de cada objeto en particular).
>
> O mediante relación de métodos, podés manipular y enlazar metodos debug
> particulares para una sección del sistema.
>
> por ejemplo:
>
> class MainWatcher(object):
>     """docstring for MainWatcher"""
>     def __init__(self, debug = False):
>         self.debug = debug
>
>     def setDebug(self, debugState):
>         if(isinstance(debugState, bool)):
>             self.debug = debugState
>         elif(isinstance(debugState, int)):
>             if(debugState > 0):
>                 self.debug = True
>             else:
>                 self.debug = False
>         else:
>             assert isinstance(debugState, bool)
>             assert isinstance(debugState, int)
>
>     def inDebug(self):
>         return(self.debug)
>
>     def getDebugMethod(self):
>         return(self.inDebug)
>
>
> class HumanAge(object):
>     """docstring for HumanAge"""
>     def __init__(self, mainWatcherDebugger):
>         super(HumanAge, self).__init__()
>         self.mainWatcherDebugger = mainWatcherDebugger
>
>     def validAge(self, age):
>         if (isinstance(age, int)):
>             if (age in range(0,100)):
>                 rtnValue = True
>             else:
>                 rtnValue = False
>
>         if (self.mainWatcherDebugger()):
>                 assert (isinstance(age, int))
>
>         return(rtnValue)
>
>
> debug = MainWatcher(True)
>
> edadHumana = HumanAge(debug.getDebugMethod)
>
> edadHumana.validAge(0)
> edadHumana.validAge(-1)
>
>
> Espero te sirva de utilidad.
>
> Saludotes!
>
>
> El 12 de junio de 2013 11:10, Apokalyptica Painkiller <
> apokalyptica79 en gmail.com> escribió:
>
> Buenísimo tu ejemplo Hugo, muchísimas gracias, y gracias Federico por los
>> links :)
>>
>>
>> El 12 de junio de 2013 10:49, Hugo Arregui <hugo.arregui en gmail.com>escribió:
>>
>> Yo uso mucho assert. Las aserciones son chequeos en runtime fuera del
>>> flujo normal del programa, para validar la coherencia interna.
>>>
>>> Supongamos una función calcularEdad(fecha_nacimiento); esta función es
>>> parte de un sistema de lo q sea, no una librería de calculo de edad,
>>> por lo tanto tiene ciertas pre y post condiciones, la precondición es
>>> que sea una fecha valida, para hacerlo simple en este caso digamos q
>>> sea una fecha del pasado. Y la post condición, es que sea una edad
>>> valida, digamos >0.
>>>
>>> def calcularEdad(fecha_nacimiento):
>>>    assert fecha_nacimiento < now()
>>>    edad = ...
>>>    assert edad > 0
>>>    return edad
>>>
>>> Ahora, nótese algunas cuestiones:
>>>
>>> 1) Pequeña aclaración: estas condiciones nunca pueden darse una si y
>>> otra no, pero a propósitos ilustrativos funcionan :-)
>>>
>>> 2) Si por alguna razón (digamos datos corruptos), hay una fecha en el
>>> futuro, y calcularEdad es parte de un proceso, el error q obtengamos
>>> durante desarrollo sera totalmente acotado:
>>>
>>>    assert fail: fecha_nacimiento < now()
>>>
>>> 3) Si nuestro sistema tiene q ser rápido, todos estos chequeos tan
>>> útiles en desarrollo son facilmente deshabilitados: es decir, testing
>>> en runtime durante desarrollo y cero overhead en prod.
>>>
>>> 4) Nótese tb que no es equivalente el assert al raise Exception, dado
>>> que una fecha de nacimiento invalida no es (en este caso), un flujo de
>>> programa valido.
>>>
>>> Saludos,
>>> Hugo
>>> _______________________________________________
>>> pyar mailing list pyar en python.org.ar
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>> Argentina - http://www.usla.org.ar
>>>
>>
>>
>>
>> --
>> I live each day
>> Like it's my last
>> I live for rock and roll
>> I never look back
>>
>> I'm a rocker
>> Do as I feel as I say
>> I'm a rocker
>> And no one can take that away
>>
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>



-- 
I live each day
Like it's my last
I live for rock and roll
I never look back

I'm a rocker
Do as I feel as I say
I'm a rocker
And no one can take that away
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20130612/0e2570e9/attachment-0001.html>


More information about the pyar mailing list