diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index e6cafb320fabf7..5f8091cd3d4ac5 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1072,7 +1072,7 @@ def __init__(self, initlist=None): if type(initlist) == type(self.data): self.data[:] = initlist elif isinstance(initlist, UserList): - self.data[:] = initlist.data[:] + self.data[:] = initlist.data else: self.data = list(initlist) def __repr__(self): return repr(self.data) @@ -1085,8 +1085,16 @@ def __cast(self, other): return other.data if isinstance(other, UserList) else other def __contains__(self, item): return item in self.data def __len__(self): return len(self.data) - def __getitem__(self, i): return self.data[i] - def __setitem__(self, i, item): self.data[i] = item + def __getitem__(self, i): + if isinstance(i, slice): + return self.__class__(self.data[i]) + else: + return self.data[i] + def __setitem__(self, i, item): + if isinstance(i, slice) and isinstance(item, UserList): + self.data[i] = item.data + else: + self.data[i] = item def __delitem__(self, i): del self.data[i] def __add__(self, other): if isinstance(other, UserList): diff --git a/Lib/test/test_userlist.py b/Lib/test/test_userlist.py index 8de6c14e392f20..82433e09e10474 100644 --- a/Lib/test/test_userlist.py +++ b/Lib/test/test_userlist.py @@ -17,6 +17,14 @@ def test_getslice(self): for j in range(-3, 6): self.assertEqual(u[i:j], l[i:j]) + def test_slice_type(self): + l = [0, 1, 2, 3, 4] + u = self.type2test(l) + self.assertIsInstance(u[:], self.type2test) + self.assertEqual(u[:], l) + self.assertIsInstance(u[::-1], self.type2test) + self.assertEqual(u[::-1], l[::-1]) + def test_add_specials(self): u = UserList("spam") u2 = u + "eggs" diff --git a/Misc/NEWS.d/next/Library/2017-12-22-21-35-25.bpo-27639.ely6aI.rst b/Misc/NEWS.d/next/Library/2017-12-22-21-35-25.bpo-27639.ely6aI.rst new file mode 100644 index 00000000000000..53eb6cf2405ff2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-12-22-21-35-25.bpo-27639.ely6aI.rst @@ -0,0 +1,2 @@ +Slices of :class:`collections.UserList` objects are now instances of ``UserList`` +or its subclasses. Patch by Dmitry Kazakov.