PEP 479: Don't let StopIteration bubble out of calls to next() inside a generator.

This commit is contained in:
Raymond Hettinger 2014-11-22 21:56:23 -08:00
parent 1bf472933b
commit 828d932a2c
2 changed files with 28 additions and 7 deletions

View File

@ -104,7 +104,10 @@ loops that truncate the stream.
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
# accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
it = iter(iterable)
total = next(it)
try:
total = next(it)
except StopIteration:
return
yield total
for element in it:
total = func(total, element)
@ -405,7 +408,10 @@ loops that truncate the stream.
def _grouper(self, tgtkey):
while self.currkey == tgtkey:
yield self.currvalue
self.currvalue = next(self.it) # Exit on StopIteration
try:
self.currvalue = next(self.it)
except StopIteration:
return
self.currkey = self.keyfunc(self.currvalue)
@ -429,7 +435,10 @@ loops that truncate the stream.
# islice('ABCDEFG', 0, None, 2) --> A C E G
s = slice(*args)
it = iter(range(s.start or 0, s.stop or sys.maxsize, s.step or 1))
nexti = next(it)
try:
nexti = next(it)
except StopIteration:
return
for i, element in enumerate(iterable):
if i == nexti:
yield element
@ -587,7 +596,10 @@ loops that truncate the stream.
def gen(mydeque):
while True:
if not mydeque: # when the local deque is empty
newval = next(it) # fetch a new value and
try:
newval = next(it) # fetch a new value and
except StopIteration:
return
for d in deques: # load it to all the deques
d.append(newval)
yield mydeque.popleft()

View File

@ -114,7 +114,10 @@ def prepare_self(next, token):
return select
def prepare_descendant(next, token):
token = next()
try:
token = next()
except StopIteration:
return
if token[0] == "*":
tag = "*"
elif not token[0]:
@ -148,7 +151,10 @@ def prepare_predicate(next, token):
signature = []
predicate = []
while 1:
token = next()
try:
token = next()
except StopIteration:
return
if token[0] == "]":
break
if token[0] and token[0][:1] in "'\"":
@ -261,7 +267,10 @@ def iterfind(elem, path, namespaces=None):
if path[:1] == "/":
raise SyntaxError("cannot use absolute path on element")
next = iter(xpath_tokenizer(path, namespaces)).__next__
token = next()
try:
token = next()
except StopIteration:
return
selector = []
while 1:
try: