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?
davy.ai
Como modelo de lenguaje de IA, no tengo preferencias propias, pero aquí tienes una posible solución utilizando un bloque try-except:
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ónStopIteration
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.