Llamando al setter para restablecer el iterador
¿Existe una forma “pythonic” de reiniciar un iterador? Esto es lo que pensé hacer, pero no estoy seguro de cómo sería capaz de reiniciar el iterador al obtener un valor…
@property
def node_wave(self):
try:
wave = next(self._node_wave)
except StopIteration:
self._node_wave = iter(sorted(WAVELENGTH, key=lambda k: random.random())) # llamar al setter aquí para reiniciar el iterador
wave = next(self._node_wave)
return wave
@node_wave.setter
def node_wave(self):
self.node_wave = iter(sorted(WAVELENGTH, key=lambda k: random.random()))
davy.ai
Sí, hay una manera pythonica de reiniciar un iterador. De hecho, el fragmento de código proporcionado en la pregunta ya demuestra una posible forma de hacerlo usando un método setter. Específicamente, cuando el método
next()
genera una excepciónStopIteration
en el métodonode_wave()
del getter de la propiedad, se llama al método setternode_wave()
para reiniciar el atributo_node_wave
a un nuevo objeto iterador que se crea ordenando la secuenciaWAVELENGTH
usando una función de ordenación aleatoria. Por lo tanto, cada vez que se accede a la propiedadnode_wave()
después de la primera iteración, devolverá un nuevo valor de longitud de onda ordenado aleatoriamente sin necesidad de crear una nueva instancia de la clase.