From: Raymond Hettinger <python@rcn.com> Date: Sat, 5 Nov 2011 20:35:26 +0000 (-0700) Subject: Improve Counter.__repr__() to not fail with unorderable values X-Git-Tag: v3.3.0a1~932^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e6bf41934de08f62b22b90cda2e331eb4641dea;p=python Improve Counter.__repr__() to not fail with unorderable values --- diff --git a/Lib/collections.py b/Lib/collections.py index 2b6abd879f..d2625fe03e 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -583,8 +583,12 @@ class Counter(dict): def __repr__(self): if not self: return '%s()' % self.__class__.__name__ - items = ', '.join(map('%r: %r'.__mod__, self.most_common())) - return '%s({%s})' % (self.__class__.__name__, items) + try: + items = ', '.join(map('%r: %r'.__mod__, self.most_common())) + return '%s({%s})' % (self.__class__.__name__, items) + except TypeError: + # handle case where values are not orderable + return '{0}({1!r})'.format(self.__class__.__name__, dict(self)) # Multiset-style mathematical operations discussed in: # Knuth TAOCP Volume II section 4.6.3 exercise 19 diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index ccf93c51c1..8dc5559cae 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -893,6 +893,12 @@ class TestCounter(unittest.TestCase): c.subtract('aaaabbcce') self.assertEqual(c, Counter(a=-1, b=0, c=-1, d=1, e=-1)) + def test_repr_nonsortable(self): + c = Counter(a=2, b=None) + r = repr(c) + self.assertIn("'a': 2", r) + self.assertIn("'b': None", r) + def test_helper_function(self): # two paths, one for real dicts and one for other mappings elems = list('abracadabra')