Skip to content

Commit 139c277

Browse files
Add UserList.discard() to match list
1 parent 80fc48e commit 139c277

4 files changed

Lines changed: 65 additions & 61 deletions

File tree

‎Lib/collections/__init__.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,6 +1386,9 @@ def pop(self, i=-1):
13861386
def remove(self, item):
13871387
self.data.remove(item)
13881388

1389+
def discard(self, item):
1390+
self.data.discard(item)
1391+
13891392
def clear(self):
13901393
self.data.clear()
13911394

‎Lib/test/list_tests.py‎

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,66 @@ def __eq__(self, other):
373373
# verify that original order and values are retained.
374374
self.assertIs(x, y)
375375

376+
def test_discard(self):
377+
a = self.type2test([0, 0, 1])
378+
a.discard(1)
379+
self.assertEqual(a, self.type2test([0, 0]))
380+
a.discard(0)
381+
self.assertEqual(a, self.type2test([0]))
382+
a.discard(0)
383+
self.assertEqual(a, self.type2test([]))
384+
a.discard(0)
385+
self.assertEqual(a, self.type2test([]))
386+
387+
self.assertRaises(TypeError, a.discard)
388+
389+
a = self.type2test([1, 2])
390+
a.discard(NEVER_EQ)
391+
self.assertEqual(a, self.type2test([1, 2]))
392+
a.discard(ALWAYS_EQ)
393+
self.assertEqual(a, self.type2test([2]))
394+
a = self.type2test([ALWAYS_EQ])
395+
a.discard(1)
396+
self.assertEqual(a, self.type2test([]))
397+
a = self.type2test([ALWAYS_EQ])
398+
a.discard(NEVER_EQ)
399+
self.assertEqual(a, self.type2test([]))
400+
a = self.type2test([NEVER_EQ])
401+
a.discard(ALWAYS_EQ)
402+
self.assertEqual(a, self.type2test([NEVER_EQ]))
403+
404+
class BadExc(Exception):
405+
pass
406+
407+
class BadCmp:
408+
def __eq__(self, other):
409+
if other == 2:
410+
raise BadExc()
411+
return False
412+
413+
a = self.type2test([0, 1, 2, 3])
414+
self.assertRaises(BadExc, a.discard, BadCmp())
415+
416+
class BadCmp2:
417+
def __eq__(self, other):
418+
raise BadExc()
419+
420+
d = self.type2test('abcdefghcij')
421+
d.discard('c')
422+
self.assertEqual(d, self.type2test('abdefghcij'))
423+
d.discard('c')
424+
self.assertEqual(d, self.type2test('abdefghij'))
425+
d.discard('c')
426+
self.assertEqual(d, self.type2test('abdefghij'))
427+
428+
# Handle comparison errors
429+
d = self.type2test(['a', 'b', BadCmp2(), 'c'])
430+
e = self.type2test(d)
431+
self.assertRaises(BadExc, d.discard, 'c')
432+
for x, y in zip(d, e):
433+
# verify that original order and values are retained.
434+
self.assertIs(x, y)
435+
376436
def test_index(self):
377437
super().test_index()
378438
a = self.type2test([-2, -1, 0, 0, 1, 2])

‎Lib/test/test_descrtut.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ def merge(self, other):
209209
'clear',
210210
'copy',
211211
'count',
212+
'discard',
212213
'extend',
213214
'index',
214215
'insert',

‎Lib/test/test_list.py‎

Lines changed: 1 addition & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import sys
33
import textwrap
44
from test import list_tests, support
5-
from test.support import ALWAYS_EQ, NEVER_EQ, cpython_only
5+
from test.support import cpython_only
66
from test.support.script_helper import assert_python_failure, assert_python_ok
77
import pickle
88
import unittest
@@ -331,66 +331,6 @@ def test_preallocation(self):
331331
self.assertEqual(iter_size, sys.getsizeof(list([0] * 10)))
332332
self.assertEqual(iter_size, sys.getsizeof(list(range(10))))
333333

334-
def test_discard(self):
335-
a = [0, 0, 1]
336-
a.discard(1)
337-
self.assertEqual(a, [0, 0])
338-
a.discard(0)
339-
self.assertEqual(a, [0])
340-
a.discard(0)
341-
self.assertEqual(a, [])
342-
a.discard(0)
343-
self.assertEqual(a, [])
344-
345-
self.assertRaises(TypeError, a.discard)
346-
347-
a = [1, 2]
348-
a.discard(NEVER_EQ)
349-
self.assertEqual(a, [1, 2])
350-
a.discard(ALWAYS_EQ)
351-
self.assertEqual(a, [2])
352-
a = [ALWAYS_EQ]
353-
a.discard(1)
354-
self.assertEqual(a, [])
355-
a = [ALWAYS_EQ]
356-
a.discard(NEVER_EQ)
357-
self.assertEqual(a, [])
358-
a = [NEVER_EQ]
359-
a.discard(ALWAYS_EQ)
360-
self.assertEqual(a, [NEVER_EQ])
361-
362-
class BadExc(Exception):
363-
pass
364-
365-
class BadCmp:
366-
def __eq__(self, other):
367-
if other == 2:
368-
raise BadExc()
369-
return False
370-
371-
a = [0, 1, 2, 3]
372-
self.assertRaises(BadExc, a.discard, BadCmp())
373-
374-
class BadCmp2:
375-
def __eq__(self, other):
376-
raise BadExc()
377-
378-
d = list('abcdefghcij')
379-
d.discard('c')
380-
self.assertEqual(d, list('abdefghcij'))
381-
d.discard('c')
382-
self.assertEqual(d, list('abdefghij'))
383-
d.discard('c')
384-
self.assertEqual(d, list('abdefghij'))
385-
386-
# Handle comparison errors
387-
d = ['a', 'b', BadCmp2(), 'c']
388-
e = list(d)
389-
self.assertRaises(BadExc, d.discard, 'c')
390-
for x, y in zip(d, e):
391-
# verify that original order and values are retained.
392-
self.assertIs(x, y)
393-
394334
def test_count_index_remove_crashes(self):
395335
# bpo-38610: The count(), index(), and remove() methods were not
396336
# holding strong references to list elements while calling

0 commit comments

Comments
 (0)