Skip to content

Commit 0a2786d

Browse files
committed
GR-26568: itertools.groupby add support for None keys
- extend the unittest for this particular case
1 parent 64478ae commit 0a2786d

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_itertools.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2019, Oracle and/or its affiliates.
1+
# Copyright (c) 2019, 2020, Oracle and/or its affiliates.
22
# Copyright (C) 1996-2017 Python Software Foundation
33
#
44
# Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
@@ -98,3 +98,6 @@ def keyfunc(obj):
9898
self.assertRaises(ExpectedError, gulp, [None], keyfunc)
9999
keyfunc.skip = 1
100100
self.assertRaises(ExpectedError, gulp, [None, None], keyfunc)
101+
102+
data = [None, None, None, 20]
103+
assert list(map(lambda x: x[0], list(groupby(data)))) == [None, 20]

graalpython/lib-graalpython/itertools.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,8 @@ class groupby(object):
559559
def __init__(self, iterable, key=None):
560560
self._iterator = iter(iterable)
561561
self._keyfunc = key
562-
self._tgtkey = self._currkey = self._currvalue = None
562+
self._marker = object()
563+
self._tgtkey = self._currkey = self._currvalue = self._marker
563564

564565
@__graalpython__.builtin_method
565566
def __iter__(self):
@@ -569,15 +570,15 @@ def __iter__(self):
569570
def __next__(self):
570571
self._skip_to_next_iteration_group()
571572
key = self._tgtkey = self._currkey
572-
grouper = _groupby(self, key)
573+
grouper = _grouper(self, key)
573574
return (key, grouper)
574575

575576
@__graalpython__.builtin_method
576577
def _skip_to_next_iteration_group(self):
577578
while True:
578-
if self._currkey is None:
579+
if self._currkey is self._marker:
579580
pass
580-
elif self._tgtkey is None:
581+
elif self._tgtkey is self._marker:
581582
break
582583
else:
583584
if not self._tgtkey == self._currkey:
@@ -593,11 +594,12 @@ def _skip_to_next_iteration_group(self):
593594
self._currvalue = newvalue
594595

595596

596-
class _groupby():
597+
class _grouper():
597598
@__graalpython__.builtin_method
598599
def __init__(self, groupby, tgtkey):
599600
self.groupby = groupby
600601
self.tgtkey = tgtkey
602+
self._marker = groupby._marker
601603

602604
@__graalpython__.builtin_method
603605
def __iter__(self):
@@ -606,22 +608,22 @@ def __iter__(self):
606608
@__graalpython__.builtin_method
607609
def __next__(self):
608610
groupby = self.groupby
609-
if groupby._currvalue is None:
611+
if groupby._currvalue is self._marker:
610612
newvalue = next(groupby._iterator)
611613
if groupby._keyfunc is None:
612614
newkey = newvalue
613615
else:
614616
newkey = groupby._keyfunc(newvalue)
615-
assert groupby._currvalue is None
617+
assert groupby._currvalue is self._marker
616618
groupby._currkey = newkey
617619
groupby._currvalue = newvalue
618620

619-
assert groupby._currkey is not None
621+
assert groupby._currkey is not self._marker
620622
if not self.tgtkey == groupby._currkey:
621623
raise StopIteration(None)
622624
result = groupby._currvalue
623-
groupby._currvalue = None
624-
groupby._currkey = None
625+
groupby._currvalue = self._marker
626+
groupby._currkey = self._marker
625627
return result
626628

627629

0 commit comments

Comments
 (0)