diff options
author | Michael Blahay <mblahay@users.noreply.github.com> | 2019-05-07 17:41:06 -0400 |
---|---|---|
committer | Mark Shannon <mark@hotpy.org> | 2019-05-07 17:41:06 -0400 |
commit | b1c3167c232c36ed3543ca351ff10c613639b5f5 (patch) | |
tree | 93ea768476af4da82e8697317a131de34c6a2772 | |
parent | ca87eebb22d202c33f3317cbf85059cadc64fa9f (diff) | |
download | cpython-git-b1c3167c232c36ed3543ca351ff10c613639b5f5.tar.gz |
bpo-27639: Correct return type for UserList slicing operation (#13169)
* BPO-27639: Correct return type for UserList slicing operation
Added logic to __getitem__ magic method for UserList to ensure that the return
type matches that of self.
-rw-r--r-- | Lib/collections/__init__.py | 6 | ||||
-rw-r--r-- | Lib/test/test_userlist.py | 6 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst | 2 |
3 files changed, 13 insertions, 1 deletions
diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index e6cafb320f..706907ad4a 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -1085,7 +1085,11 @@ class UserList(_collections_abc.MutableSequence): 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 __getitem__(self, i): + if isinstance(i, slice): + return self.__class__(self.data[i]) + else: + return self.data[i] def __setitem__(self, i, item): self.data[i] = item def __delitem__(self, i): del self.data[i] def __add__(self, other): diff --git a/Lib/test/test_userlist.py b/Lib/test/test_userlist.py index 8de6c14e39..1ed67dac80 100644 --- a/Lib/test/test_userlist.py +++ b/Lib/test/test_userlist.py @@ -17,6 +17,12 @@ class UserListTest(list_tests.CommonTest): 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 = UserList(l) + self.assertIsInstance(u[:], u.__class__) + self.assertEqual(u[:],u) + def test_add_specials(self): u = UserList("spam") u2 = u + "eggs" diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst new file mode 100644 index 0000000000..ae5b915969 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-07-15-49-17.bpo-27639.b1Ah87.rst @@ -0,0 +1,2 @@ +Correct return type for UserList slicing operations. Patch by Michael Blahay, +Erick Cervantes, and vaultah |