Skip to content

Commit 63e77a5

Browse files
committed
fix zip_longest
1 parent 1e44db3 commit 63e77a5

File tree

1 file changed

+32
-29
lines changed

1 file changed

+32
-29
lines changed

graalpython/lib-graalpython/itertools.py

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -865,47 +865,50 @@ class zip_longest():
865865
"""
866866

867867
@__graalpython__.builtin_method
868-
def __iter__(self):
868+
def __new__(subtype, *args, fillvalue=None):
869+
self = object.__new__(subtype)
870+
self.fillvalue = fillvalue
871+
self.tuplesize = len(args)
872+
self.numactive = len(args)
873+
self.ittuple = [iter(arg) for arg in args]
869874
return self
870875

871876
@__graalpython__.builtin_method
872-
def _fetch(self, index):
873-
it = self.iterators[index]
874-
if it is not None:
875-
try:
876-
return next(it)
877-
except StopIteration:
878-
self.active -= 1
879-
if self.active <= 0:
880-
# It was the last active iterator
881-
raise
882-
self.iterators[index] = None
883-
return self.fillvalue
877+
def __iter__(self):
878+
return self
884879

885880
@__graalpython__.builtin_method
886881
def __next__(self):
887-
if self.active <= 0:
882+
if not self.tuplesize:
888883
raise StopIteration
889-
nb = len(self.iterators)
890-
if nb == 0:
884+
if not self.numactive:
891885
raise StopIteration
892-
result = []
893-
for index in range(nb):
894-
result.append(self._fetch(index))
886+
result = [None] * self.tuplesize
887+
for idx, it in enumerate(self.ittuple):
888+
if it is None:
889+
item = self.fillvalue
890+
else:
891+
try:
892+
item = next(it)
893+
except StopIteration:
894+
self.numactive -= 1
895+
if self.numactive == 0:
896+
raise StopIteration
897+
else:
898+
item = self.fillvalue
899+
self.ittuple[idx] = None
900+
except:
901+
self.numactive = 0
902+
raise
903+
result[idx] = item
895904
return tuple(result)
896905

897-
@__graalpython__.builtin_method
898-
def __new__(subtype, iter1, *args, fillvalue=None):
899-
self = object.__new__(subtype)
900-
self.fillvalue = fillvalue
901-
self.active = len(args) + 1
902-
self.iterators = [iter(iter1)] + [iter(arg) for arg in args]
903-
return self
904-
905906
@__graalpython__.builtin_method
906907
def __reduce__(self):
907-
return type(self), tuple([(it if it else tuple()) for it in self.iterators]), self.fillvalue
908-
908+
args = []
909+
for elem in self.ittuple:
910+
args.append(elem if elem is not None else tuple())
911+
return type(self), tuple(args), self.fillvalue
909912

910913
@__graalpython__.builtin_method
911914
def __setstate__(self, state):

0 commit comments

Comments
 (0)