mooder
mooder

Reputation: 363

Calling setter to reset iterator

Is there a pythonic way to reset an iterator? Here's what I thought doing but I am not sure how I would be able to reset the iterator when getting a value...

@property
def node_wave(self):
    try:
        wave = next(self._node_wave)
    except StopIteration:
        self._node_wave = iter(sorted(WAVELENGTH, key=lambda k: random.random()))  #call setter here to reset the iterator
        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()))

Upvotes: 0

Views: 77

Answers (1)

chepner
chepner

Reputation: 531708

Rather than explicitly resetting self._node_wave, just define a private generator that takes care of cycling over the values.

def _wave_generator(self):
    while True:
        yield from sorted(WAVELENGTH, key=lambda k: random.random())

def __init__(self):
    self._node_wave = _wave_generator()

@property
def node_wave(self):
    return next(self._node_wave)

Because of how _wave_generator is defined, next(self._node_wave) will never raise StopIteration. When one sorted list is exhausted, another one is automatically created.

Upvotes: 4

Related Questions