Python Stopiteration标识iterable对象
我有2个生成器,使用下一种方法&while循环处理,如下所示 代码 如何确定哪个迭代器对象没有行 我试图比较两个表,每个表行都在生成器对象中Python Stopiteration标识iterable对象,python,Python,我有2个生成器,使用下一种方法&while循环处理,如下所示 代码 如何确定哪个迭代器对象没有行 我试图比较两个表,每个表行都在生成器对象中 def _compare(self): end_of_table = 'N' try: while end_of_table =='N': try: if self.table1_key == self.table2_key:
def _compare(self):
end_of_table = 'N'
try:
while end_of_table =='N':
try:
if self.table1_key == self.table2_key:
print 'same key'
self.table1_row = next(self.table1_generator)
self._convert_table1_key_fields()
self.table2_row = next(self.table2_generator)
self._convert_table2_key_fields()
elif self.table1_key > self.table2_key:
self.table2_row = next(self.table1_generator)
self._convert_table2_key_fields()
elif self.table1_key < self.table2_key:
self.table1_row = next(self.table2_generator)
self._convert_table1_key_fields()
except StopIteration as e:
print e.args
print 'IterError'
end_of_table = 'y'
except StopIteration:
print 'Next Iteration'
def\u比较(自):
_表的_结尾='N'
尝试:
而_表的结束_='N':
尝试:
如果self.table1\u key==self.table2\u key:
打印“相同密钥”
self.table1\u行=下一个(self.table1\u生成器)
self.\u转换\u表1\u键\u字段()
self.table2\u行=下一个(self.table2\u生成器)
self.\u convert\u table 2\u key\u fields()
elif self.table1\u键>self.table2\u键:
self.table2\u行=下一个(self.table1\u生成器)
self.\u convert\u table 2\u key\u fields()
elif self.table1\u键
您没有提供有关上下文的详细信息,也没有提供您实际要做的事情,但这听起来可能对您的情况很有用(而且更像pythonic)。您可以填写Nones
或其他合适的值。您可以向下一个提供第二个“sentinel”值:
sentinel = object()
while end_of_loop = 'n':
table1_row = next(table1_generator,sentinel)
table2_row = next(table2_generator,sentinel)
#I don't account for the case where they could be exhausted at
#the same time. It's easy to add that if it matters though.
if table1_row is sentinel:
print "table1_generator gave up first"
#"break" might be more appropriate ...
#(Unless there more to the loop than this.)
end_of_loop = 'y'
elif table2_row is sentinel:
print "table2_generator gave up first"
end_of_loop = 'y'
我想不出这方面的用例(要不要共享?),但我会尝试将next
包装到我自己的函数中:
def mynext(it):
try:
return next(it)
except StopIteration:
raise StopIteration(it)
然后,比如说,
a = iter([1,2,3,4,5])
b = iter([4,5,6,7])
try:
while True:
print mynext(a)
print mynext(b)
except StopIteration as e:
if e.args[0] == a: print 'a ended'
if e.args[0] == b: print 'b ended'
@user1050619:它是空的,因为您使用的是裸next
,而不是包装器。
a = iter([1,2,3,4,5])
b = iter([4,5,6,7])
try:
while True:
print mynext(a)
print mynext(b)
except StopIteration as e:
if e.args[0] == a: print 'a ended'
if e.args[0] == b: print 'b ended'