¿Cómo accedería a una variable local definida dentro de un generador de Python desde fuera del generador?Acceso a variables locales dentro de un generador de Python
Tengo un caso en el que mi generador manipula un estado local, y para pruebas unitarias quiero inspeccionar este estado para asegurarme de que contiene los valores correctos.
No puedo almacenar el estado en una variable de instancia (por ejemplo, self.state = blah), porque podría estar creando múltiples generadores de la misma instancia de clase, lo que significa que los generadores podrían sobreescribir el estado del otro. Tampoco puedo devolver el estado en la expresión de rendimiento, porque el nombre de estado puede cambiar o variar debido a instancias de generador individuales.
p. Ej. Quiero hacer algo como esto (aunque este código no funciona)
from random import random
class MyIter(object):
def __iter__(self):
context = {}
for i in xrange(10):
context[random()] = random()
yield i
obj = MyIter()
i1 = iter(obj)
i2 = iter(obj)
while 1:
try:
i1.next()
i2.next()
print i1.context
print i2.context
except StopIteration:
break
hay alguna forma de acceder a las variables locales mediante la inspección de pila de ejecución de Python?
¡Ay! No hagas esto, es un detalle de implementación de CPython. Podría cambiar con las versiones más nuevas y ser diferente para las diferentes implementaciones de Python (como Jython o IronPython). Y tampoco es muy fácil de leer ... –
Es muy poco probable que alguna vez use Jython o IronPython, y ambos tienen muchas incompatibilidades con la funcionalidad de CPython "estándar", pero apuntan bien. – Cerin
+1 Aunque nunca confío en ningún código que tenga que acceder al estado interno de un generador durante el funcionamiento normal, * es * muy útil para poder obtener estos datos durante la depuración dado que ha habido algunas veces cuando Python me ha dejado preguntándome, "¿Qué estabas pensando?" (Además, nunca me sentiría mal por responder mi propia pregunta, a menos que la respuesta fuera incorrecta;)) – Augusta