'''
if len(args) > 1:
raise TypeError('expected at most 1 arguments, got %d' % len(args))
+ self.__in_repr = False # detects recursive repr
try:
self.__root
except AttributeError:
def __reduce__(self):
'Return state information for pickling'
items = [[k, self[k]] for k in self]
- tmp = self.__map, self.__root
- del self.__map, self.__root
+ tmp = self.__map, self.__root, self.__in_repr
+ del self.__map, self.__root, self.__in_repr
inst_dict = vars(self).copy()
- self.__map, self.__root = tmp
+ self.__map, self.__root, self.__in_repr = tmp
if inst_dict:
return (self.__class__, (items,), inst_dict)
return self.__class__, (items,)
def __repr__(self):
'od.__repr__() <==> repr(od)'
+ if self.__in_repr:
+ return '...'
if not self:
return '%s()' % (self.__class__.__name__,)
- return '%s(%r)' % (self.__class__.__name__, list(self.items()))
+ self.__in_repr = True
+ try:
+ result = '%s(%r)' % (self.__class__.__name__, list(self.items()))
+ finally:
+ self.__in_repr = False
+ return result
def copy(self):
'od.copy() -> a shallow copy of od'
self.assertEqual(eval(repr(od)), od)
self.assertEqual(repr(OrderedDict()), "OrderedDict()")
+ def test_repr_recursive(self):
+ # See issue #9826
+ od = OrderedDict.fromkeys('abc')
+ od['x'] = od
+ self.assertEqual(repr(od),
+ "OrderedDict([('a', None), ('b', None), ('c', None), ('x', ...)])")
+
def test_setdefault(self):
pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
shuffle(pairs)
to fetch the original errno, or to filter timeout errors. Now the
original error is re-raised.
+- Issue #9826: OrderedDict.__repr__ can now handle self-referential
+ values: d['x'] = d.
+
- Issue #9758: When fcntl.ioctl() was called with mutable_flag set to True,
and the passed buffer was exactly 1024 bytes long, the buffer wouldn't
be updated back after the system call. Original patch by Brian Brazil.