PEP 479,map()和StopIteration

时间:2016-07-04 23:32:35

标签: python python-3.x

似乎PEP 479(更改生成器内的StopIteration处理)带来了许多不便。 zip等价的示例代码(来自python的2.7文档,我自己略有改动):

def izip(*iterables):
   # izip('ABCD', 'xy') --> Ax By
   iterators = list(map(iter, iterables))
   while True: 
       yield tuple(map(next,iterators))
  

zipper = izip([1,2],[3,4])

     

下(拉链)

     

(1,3)

     

下(拉链)

     

(2,4)

     

下(拉链)

     

()

     

下(拉链)

     

()

map()内置生成器吞下由Next()引发的StopIteration,因此拉链生成器永远不会结束。我甚至无法在izip中捕获异常,因为问题存在于map()内部。有没有pythonic方法来解决这个问题而不编写自定义地图()?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以检查tuple的{​​{1}}的长度,并在yield的长度小于iterators的情况下中断循环:

def izip(*iterables):
    iterators = list(map(iter, iterables))
    while True:
        t = tuple(map(next,iterators))
        if len(t) != len(iterators):
            break
        yield t

zipper = izip([1, 2], [3, 4])
print(next(zipper)) # (1, 2)
print(next(zipper)) # (3, 4)
print(next(zipper)) # StopIteration