Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a5ac2ce

Browse files
committed
Backport 3.3 fixes and cleans ups.
1 parent 81b9656 commit a5ac2ce

2 files changed

Lines changed: 22 additions & 11 deletions

File tree

Lib/collections.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,9 @@ def __iter__(self):
716716
def __contains__(self, key):
717717
return any(key in m for m in self.maps)
718718

719+
def __bool__(self):
720+
return any(self.maps)
721+
719722
@_recursive_repr()
720723
def __repr__(self):
721724
return '{0.__class__.__name__}({1})'.format(

Lib/test/test_collections.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@
2323
### _ChainMap (helper class for configparser)
2424
################################################################################
2525

26+
ChainMap = _ChainMap # rename to keep test code in sync with 3.3 version
27+
2628
class TestChainMap(unittest.TestCase):
2729

2830
def test_basics(self):
29-
c = _ChainMap()
31+
c = ChainMap()
3032
c['a'] = 1
3133
c['b'] = 2
3234
d = c.new_child()
@@ -71,19 +73,25 @@ def test_basics(self):
7173
for m1, m2 in zip(d.maps, e.maps):
7274
self.assertIsNot(m1, m2, e)
7375

74-
d = d.new_child()
75-
d['b'] = 5
76-
self.assertEqual(d.maps, [{'b': 5}, {'c':30}, {'a':1, 'b':2}])
77-
self.assertEqual(d.parents.maps, [{'c':30}, {'a':1, 'b':2}]) # check parents
78-
self.assertEqual(d['b'], 5) # find first in chain
79-
self.assertEqual(d.parents['b'], 2) # look beyond maps[0]
76+
f = d.new_child()
77+
f['b'] = 5
78+
self.assertEqual(f.maps, [{'b': 5}, {'c':30}, {'a':1, 'b':2}])
79+
self.assertEqual(f.parents.maps, [{'c':30}, {'a':1, 'b':2}]) # check parents
80+
self.assertEqual(f['b'], 5) # find first in chain
81+
self.assertEqual(f.parents['b'], 2) # look beyond maps[0]
8082

8183
def test_contructor(self):
82-
self.assertEqual(_ChainMap().maps, [{}]) # no-args --> one new dict
83-
self.assertEqual(_ChainMap({1:2}).maps, [{1:2}]) # 1 arg --> list
84+
self.assertEqual(ChainMap().maps, [{}]) # no-args --> one new dict
85+
self.assertEqual(ChainMap({1:2}).maps, [{1:2}]) # 1 arg --> list
86+
87+
def test_bool(self):
88+
self.assertFalse(ChainMap())
89+
self.assertFalse(ChainMap({}, {}))
90+
self.assertTrue(ChainMap({1:2}, {}))
91+
self.assertTrue(ChainMap({}, {1:2}))
8492

8593
def test_missing(self):
86-
class DefaultChainMap(_ChainMap):
94+
class DefaultChainMap(ChainMap):
8795
def __missing__(self, key):
8896
return 999
8997
d = DefaultChainMap(dict(a=1, b=2), dict(b=20, c=30))
@@ -100,7 +108,7 @@ def __missing__(self, key):
100108
d.popitem()
101109

102110
def test_dict_coercion(self):
103-
d = _ChainMap(dict(a=1, b=2), dict(b=20, c=30))
111+
d = ChainMap(dict(a=1, b=2), dict(b=20, c=30))
104112
self.assertEqual(dict(d), dict(a=1, b=2, c=30))
105113
self.assertEqual(dict(d.items()), dict(a=1, b=2, c=30))
106114

0 commit comments

Comments
 (0)