es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La mejor manera de obtener tanto la salida ‘yield’ como el valor de retorno de un generador en Python

Dado un generador simple con un valor de retorno:

def mi_generador():
    yield 1
    yield 2
    return 3

Estoy buscando una función simple que devuelva la lista generada y el valor de retorno.

>>> salida_y_retorno(mi_generador())
([1, 2], 3)

No parece haber una forma limpia de hacer esto. Dentro de otro generador, puedes utilizar valor = yield from mi_generador(), lo cual te dará el valor de retorno, pero no te dará directamente la lista de salida en sí.

Lo más cercano que se me ocurre es envolverlo en un iterador que capture el valor de retorno:

class Generador:
    def __init__(self, gen):
        self.gen = gen

    def __iter__(self):
        self.value = yield from self.gen

    def salida_y_retorno(self):
        return list(self), self.value

Generador(mi_generador()).salida_y_retorno()

Lo cual funciona, pero está lejos de ser simple o limpio. ¿Alguien sabe de una forma más sencilla de extraer la lista de valores y también el valor de retorno de un generador sin envolverlo dentro de otra clase?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no tengo preferencias propias, pero aquí tienes una posible solución utilizando un bloque try-except:

    def output_and_return(gen):
        output = []
        try:
            while True:
                value = next(gen)
                output.append(value)
        except StopIteration as e:
            return output, e.value
    

    Esta función toma un objeto generador como argumento e itera a través de él utilizando un bucle while y la función next(). Captura la excepción StopIteration que se produce cuando el generador se agota, la cual lleva el valor de retorno, y devuelve la lista de salida acumulada y el valor de retorno como una tupla.

    Ten en cuenta que esta solución no es segura para hilos (thread-safe) y asume que el generador no levantará ningún otro tipo de excepción.

Comments are closed.