Snippet: assertiter

Este bichito lo uso bastante para validar estructuras de iterables en librerias

def assertiter(obj, itertype=None, length=None, content=None):
    """Valide content of iterable.
    
    @param obj: The iterable to validate.
    @param itertype: Specify the class of the itereable, otherwise is lookup 
                     if obj has '__iter__' attribute.
    @param length: The valid length of the iterable. If its None any length is 
                   valid.
    @param content: Type of the content of the iterable.
    
    """
    if itertype != None:
        assert isinstance(obj, itertype), \
               "obj must be instance of '%s', found '%s'" % (itertype.__name__,  type(obj).__name__)
    else:
        assert hasattr(obj, "__iter__"), "'%s' is not iterable" % str(obj)
        
    if length != None:
        assert isinstance(length, int), \
               "length must be instance of 'int', found '%s'" \
               % type(length).__name__
               
        assert len(obj) == length, \
               "'obj' length must be %i, found: %i" % (length, len(obj))
        
    if content != None:
        assert isinstance(content, (list, tuple)), "'content' is not iterable"
        
        for idx, c, ct in zip(range(len(obj)), obj, content):
            
            assert isinstance(c, ct), \
                   "Element on position %i must be instance of %s, found '%s'" \
                   % (idx, ct.__name__, type(c).__name__)
       
    return True

Uso:

def foo(lista):
    # valida que la lista sea de tipo list, de 3 elementos  y el primero
    # sea un int, el segundo un float y el tercero un string
    assert assertiter(lista, type=list length=3, content=[int, float, str])
    print "ok"

foo([1,2.0, "hola"]) # funciona
foo([1]) # falla, faltan 2 elementos
foo((1,2.0, "hola")) # falla es una tupla
Anuncios

Acerca de JuanBC
About Me. * Ing. en Sistemas. * Entusiasta de los comics. * Linux user. * Java, Bash, Python, C. * RPG Fan. * Escritor.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: