Skip to content

Commit 3367ea5

Browse files
committed
Make iteritems, iterkeys, itervalues, viewitems, viewkeys, viewvalues raise AttributeError
1 parent 4eca5d2 commit 3367ea5

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

HISTORY.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ Sorted Containers Release History
77

88
.. currentmodule:: sortedcontainers
99

10+
2.0.4 (2018-06-06)
11+
------------------
12+
13+
**Bugfixes**
14+
15+
* `SortedDict` methods `iterkeys`, `iteritems`, `itervalues`, `viewkeys`,
16+
`viewitems`, and `viewvalues` are not implemented for Python 2. Attribute
17+
lookup now raises :exc:`AttributeError`.
18+
1019
2.0.3 (2018-05-31)
1120
------------------
1221

sortedcontainers/sorteddict.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
1717
"""
1818

19+
import sys
1920
import warnings
2021
from collections import ItemsView, KeysView, ValuesView, Sequence
2122

@@ -357,6 +358,26 @@ def values(self):
357358
return SortedValuesView(self)
358359

359360

361+
if sys.hexversion < 0x03000000:
362+
def __make_raise_attributeerror(original, alternate):
363+
message = (
364+
'SortedDict.{original}() is not implemented.'
365+
' Use SortedDict.{alternate}() instead.'
366+
).format(original=original, alternate=alternate)
367+
def method(self):
368+
raise AttributeError(message)
369+
method.__name__ = original
370+
method.__doc__ = message
371+
return property(method)
372+
373+
iteritems = __make_raise_attributeerror('iteritems', 'items')
374+
iterkeys = __make_raise_attributeerror('iterkeys', 'keys')
375+
itervalues = __make_raise_attributeerror('itervalues', 'values')
376+
viewitems = __make_raise_attributeerror('viewitems', 'items')
377+
viewkeys = __make_raise_attributeerror('viewkeys', 'keys')
378+
viewvalues = __make_raise_attributeerror('viewvalues', 'values')
379+
380+
360381
class _NotGiven(object):
361382
# pylint: disable=too-few-public-methods
362383
def __repr__(self):

tests/test_coverage_sorteddict.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,11 @@ def test_values():
215215
temp = SortedDict(mapping)
216216
assert list(temp.values()) == [pos for key, pos in mapping]
217217

218+
def test_iterkeys():
219+
temp = SortedDict()
220+
with pytest.raises(AttributeError):
221+
temp.iterkeys
222+
218223
def test_notgiven():
219224
assert repr(SortedDict._SortedDict__not_given) == '<not-given>'
220225

0 commit comments

Comments
 (0)