我构建了一个可迭代对象A,它包含其他对象的列表B.如果在for循环中使用对象A时标记为坏,我希望能够自动跳过列表中的特定对象B. / p>
class A():
def __init__(self):
self.Blist = [B(1), B(2), B(3)] #where B(2).is_bad() is True, while the other .is_bad() are False
def __iter__(self):
nextB = iter(self.Blist)
#if nextB.next().is_bad():
# return after skip
#else:
# return nextB
但是,我无法弄清楚如何编写上面伪代码中注释的条件,而不跳过迭代查询(else子句失败)
谢谢!
答案 0 :(得分:1)
怎么样:
def __iter__(self):
nextB = iter(self.Blist)
for b_obj in nextB:
if b_obj.is_bad():
yield b_obj
简化示例:
class B:
def __init__(self, cond):
self.cond = cond
def is_bad(self):
return self.cond
class A:
def __init__(self):
self.Blist = [B(True), B(False), B(True)]
def __iter__(self):
nextB = iter(self.Blist)
for b_obj in nextB:
if b_obj.is_bad():
yield b_obj
a = A()
for x in a:
print(x.is_bad())
>> True
True
答案 1 :(得分:1)
您可以使用生成器功能:
def __iter__(self):
for item in self.Blist:
if not item.is_bad():
yield item
生成器函数由关键字yield
标记。生成器函数返回一个生成器对象,它是一个迭代器。它将暂停执行yield
语句,然后在调用例程调用interator上的next
时继续处理。