Un número de veces que he pensado que el estilo generador puede ser más directa que la devolución de una lista, por ejemplo,¿Existe una función de biblioteca en Python para convertir una función de generador en una función que devuelve una lista?
def foo(input_array):
for x in input_array:
yield processed(x)
vs
def bar(input_array):
accumulator = []
for x in input_array:
accumulator.append(processed(x))
return accumulator
(bien, si fuera así de simple , Escribiría map
, pero entiendes: la versión del generador es más limpia). Sin embargo, un tipo de retorno de un generador no siempre es deseado. ¿Hay un decorador incorporado que pueda usar para cambiar foo
en una función que devuelva una lista o tupla? La forma en que me gustaría escribir yo mismo es,
import functools
def transform_return_value(transformer):
def inner(f):
@functools.wraps(f)
def new_f(*argv, **kwargs):
return transformer(f(*argv, **kwargs))
return new_f
return inner
@transform_return_value(list)
def foo(input_array):
for x in input_array:
yield processed(x)
Espera ... ¿Quieres escribir una función de generador que devuelva una lista? No estoy seguro de entender esto. ¿Por qué no simplemente escribir 'list (generator_function())', o escribir 'list_function()' para comenzar? – mgilson
Otra opción es usar la comprensión de listas: '[procesado (x) para x en input_array]'. Posiblemente más limpio que ambos ... –
@mgilson tiene razón: por lo general, convertirías a la lista cuando necesites una lista, que invariablemente está en el código del cliente. Tiendo a documentar funciones como iterables que regresan y mantener una función 'to_sequence (x)' alrededor que efectivamente '' lista (x) si no esinstancia (x, Secuencia) else x'. –