【问题标题】:Calling setter to reset iterator调用 setter 来重置迭代器
【发布时间】:2022-01-20 17:08:22
【问题描述】:

有没有一种 Python 的方式来重置迭代器?这是我的想法,但我不确定如何在获取值时重置迭代器...

@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()))

【问题讨论】:

  • 此代码确实在获取值时重置迭代器self._node_wave。你到底对什么感到困惑?请edit 澄清。另外,您要解决的实际问题是什么?警惕XY problem。使用最少但完整的代码、期望的输出和不期望的输出创建 minimal reproducible example 会有所帮助。
  • setter 需要一个值,而 node_wave.setter 缺少该值。你希望它做什么?
  • 糟糕,评论被隐藏在屏幕外。所以你想在那条线上调用setter?我想我明白了你想要做的事情,比如概括代码,但据我所知,使用 setter 没有任何意义。

标签: python python-3.x iterator getter-setter


【解决方案1】:

与其显式重置self._node_wave,不如定义一个负责循环遍历值的私有生成器。

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)

由于_wave_generator 的定义方式,next(self._node_wave) 永远不会引发StopIteration。当一个排序列表用完时,会自动创建另一个排序列表。

【讨论】:

    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2011-11-22
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    相关资源
    最近更新 更多