Link Search Menu Expand Document

Assert en Python

El uso de assert en Python nos permite realizar comprobaciones. Si la expresión contenida dentro del mismo es False, se lanzará una excepción, concretamente AssertionError. Veamos un ejemplo:

assert(1==2)
# AssertionError

Es decir, si el contenido existente dentro del assert es igual a False, se lanzará la excepción. Se podría conseguir el mismo resultado haciendo lo siguiente, pero el uso de assert() resulta más cómodo.

if condicion:
    raise AssertionError()

Podemos también añadir un texto con información relevante acerca del assert().

assert False, "El assert falló"

Aunque mucho cuidado, ya que la expresión anterior no es equivalente a la siguiente, siendo la misma errónea. Esto se debe a que en realidad se está evaluando bool((False, "El assert falló")), lo que resulta ser siempre True. De hecho el siguiente código no lanzaría una excepción, cuando realmente se esperaría que lo hiciera.

# INCORRECTO
assert(False, "El assert falló")

Por otro lado, también se puede hacer uso del assert() sin usar paréntesis como se muestra a continuación.

x = "ElLibroDePython"
assert x == "ElLibroDePython"

assert() en testing

La función assert() puede ser también muy útil para realizar testing de nuestro código, especialmente para test unitarios o unit tests. Imagínate que tenemos una función calcula_media() que como su nombre indica calcula la media de un conjunto de números.

def calcula_media(lista):
    return sum(lista)/len(lista)

En el mundo de la programación es muy importante probar o testear el software, para asegurarse de que está libre de errores. Gracias al uso de assert() podemos realizar estas comprobaciones de manera automática.

assert(calcula_media([5, 10, 7.5]) == 7.5)
assert(calcula_media([4, 8]) == 6)

Por lo que si hacemos que estas comprobaciones sean parte de nuestro código, podríamos proteger nuestra función, asegurándonos de que nadie la “rompa”.

assert() en funciones

Puede resultar útil usar assert() cuando queremos realizar alguna comprobación, como podría ser dentro de una función. En el siguiente ejemplo tenemos una función suma() que sólo suma las variables si son números enteros.

# Funcion suma de variables enteras
def suma(a, b):
    assert(type(a) == int)
    assert(type(b) == int)
    return a+b

# Error, ya que las variables no son int
suma(3.0, 5.0)

# Ok, los argumentos son int
suma(3, 5)

assert() con clases

Otro ejemplo podría verificar que un objeto pertenece a una clase determinada.

class MiClase():
    pass

class MiOtraClase():
    pass

mi_objeto = MiClase()
mi_otro_objeto = MiOtraClase()

# Ok
assert(isinstance(mi_objeto, MiClase))

# Ok
assert(isinstance(mi_otro_objeto, MiOtraClase))

# Error, mi_objeto no pertenece a MiOtraClase
assert(isinstance(mi_objeto, MiOtraClase))

# Error, mi_otro_objeto no pertenece a MiClase
assert(isinstance(mi_otro_objeto, MiClase))

Deshabilitar assert

A modo de curiosidad, es posible ejecutar un script de Python deshabilitando el assert. Supongamos que tenemos el siguiente código.

# ejemplo.py
assert(1==2)

Si ejecutamos nuestro script de la siguiente manera, los assert se eliminarán, por lo que no se producirá ninguna excepción.

$ python -O ejemplo.py