[pyar] función con valores de retorno distintos

Matias Graña matias.alejo en gmail.com
Mar Jul 29 11:28:17 ART 2014


Hola;
tengo una función que lee un archivo, hace alguna cosa y devuelve el
contenido separado por líneas y, eventualmente, separando una línea (o más)
de headers.
Se puede hacer así (versión simplificada):

def _get_lines(infile, header_lines=1):
    with open(infile, 'r') as data:
        ret = [blabla(line) for line in data]
    header = None if not header_lines else ret[0] if header_lines == 1 else
ret[:header_lines]
    return header, ret[header_lines:]

Eso se llama con
header, lines = _get_lines(infile)
El punto es que header puede ser None, un str o una lista de str, en
función del valor de header_lines. La pregunta es (y es más amplia que este
ejemplo puntual) si es razonable que los valores de retorno de una función
cambien el tipo de esta manera.
Esta forma de hacerlo tiene la ventaja de que los casos de uso típico van a
ser con header_lines = 0 o 1 y entonces en esos casos es cómodo. Pero si en
algún momento cambia algo y header_lines debe ser > 1, hay que cambiar el
código un poco más que si en el return tuviera

return ret[:header_lines], ret[header_lines:]

Otra opción, que tiene sus pros y sus contras también, es

return tuple(ret[:header_lines]) + (ret[header_lines:],)

Eso hace que deba llamarse con

lines = _get_lines(infile, header_lines=0)
header, lines = _get_lines(infile, header_lines=1)
header1, header2, lines = _get_lines(infile, header_lines=2)

etc. Acá lo que cambia es la cantidad de datos a devolver, y también puede
ser propenso a errores. En python3 sería un poco más sencillo, porque puedo
devolver directamente tuple(ret), sin calentarme por header_lines, y
obligar al llamado a que sea del estilo de

header, *lines = _get_lines(infile)

Lamentablemente, python3 no es una posibilidad acá. Imagino que no hay una
única manera correcta de hacer las cosas, pero argumentos a favor o
encontra de estas opciones son bienvenidos.

Gracias!

-- Matías Graña
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140729/d3e66ae8/attachment.html>


More information about the pyar mailing list