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 鈥渞ompa鈥.

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