Skip to content

Commit 2d03e4f

Browse files
committed
BUG: Make dict iterators real iterators, provide "next()" in Python 2
1 parent 23810e5 commit 2d03e4f

File tree

2 files changed

+23
-25
lines changed

2 files changed

+23
-25
lines changed

pandas/compat/__init__.py

+16-24
Original file line numberDiff line numberDiff line change
@@ -152,32 +152,24 @@ def signature(f):
152152
lmap = builtins.map
153153
lfilter = builtins.filter
154154

155+
def _iterfactory(what):
156+
"""Functions to process/iterate on dictionaries' values/keys/items."""
157+
iterwhat = "iter%s" % what
158+
if PY2:
159+
def func(obj, **kw):
160+
return getattr(obj, iterwhat)(**kw)
161+
else:
162+
def func(obj, **kw):
163+
return iter(getattr(obj, what)(**kw))
164+
return func
155165

156-
def iteritems(obj, **kwargs):
157-
"""replacement for six's iteritems for Python2/3 compat
158-
uses 'iteritems' if available and otherwise uses 'items'.
159-
160-
Passes kwargs to method.
161-
"""
162-
func = getattr(obj, "iteritems", None)
163-
if not func:
164-
func = obj.items
165-
return func(**kwargs)
166-
167-
168-
def iterkeys(obj, **kwargs):
169-
func = getattr(obj, "iterkeys", None)
170-
if not func:
171-
func = obj.keys
172-
return func(**kwargs)
173-
174-
175-
def itervalues(obj, **kwargs):
176-
func = getattr(obj, "itervalues", None)
177-
if not func:
178-
func = obj.values
179-
return func(**kwargs)
166+
iteritems, iterkeys, itervalues = (_iterfactory(what)
167+
for what in ("items","keys", "values"))
180168

169+
if PY2:
170+
next = lambda it : it.next()
171+
else:
172+
next = next
181173

182174
def bind_method(cls, name, func):
183175
"""Bind a method to class, python 2 and python 3 compatible.

pandas/tests/test_compat.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"""
55

66
from pandas.compat import (range, zip, map, filter, lrange, lzip, lmap,
7-
lfilter, builtins)
7+
lfilter, builtins, iterkeys, itervalues, iteritems,
8+
next)
89
import pandas.util.testing as tm
910

1011

@@ -61,3 +62,8 @@ def test_zip(self):
6162
expected = list(builtins.zip(*lst)),
6263
lengths = 10,
6364
self.check_result(actual, expected, lengths)
65+
66+
def test_dict_iterators(self):
67+
self.assertEqual(next(itervalues({1: 2})), 2)
68+
self.assertEqual(next(iterkeys({1: 2})), 1)
69+
self.assertEqual(next(iteritems({1: 2})), (1, 2))

0 commit comments

Comments
 (0)