blob: 5b1aa75362a9d38c2fd6c150b88870ceaf13f8d3 [file] [log] [blame]
Walter Dörwald1dde95d2003-12-08 11:38:45 +00001"""
2Tests common to list and UserList.UserList
3"""
4
5import sys
Raymond Hettingerbcab2b22004-09-29 08:03:17 +00006import os
Walter Dörwald1dde95d2003-12-08 11:38:45 +00007
Benjamin Petersonee8712c2008-05-20 21:35:26 +00008from test import support, seq_tests
Walter Dörwald1dde95d2003-12-08 11:38:45 +00009
Raymond Hettinger70b64fc2008-01-30 20:15:17 +000010def CmpToKey(mycmp):
11 'Convert a cmp= function into a key= function'
12 class K(object):
13 def __init__(self, obj):
14 self.obj = obj
15 def __lt__(self, other):
16 return mycmp(self.obj, other.obj) == -1
17 return K
18
Walter Dörwald1dde95d2003-12-08 11:38:45 +000019class CommonTest(seq_tests.CommonTest):
20
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000021 def test_init(self):
22 # Iterable arg is optional
23 self.assertEqual(self.type2test([]), self.type2test())
24
25 # Init clears previous values
26 a = self.type2test([1, 2, 3])
27 a.__init__()
28 self.assertEqual(a, self.type2test([]))
29
30 # Init overwrites previous values
31 a = self.type2test([1, 2, 3])
32 a.__init__([4, 5, 6])
33 self.assertEqual(a, self.type2test([4, 5, 6]))
34
35 # Mutables always return a new object
36 b = self.type2test(a)
37 self.assertNotEqual(id(a), id(b))
38 self.assertEqual(a, b)
39
Walter Dörwald1dde95d2003-12-08 11:38:45 +000040 def test_repr(self):
41 l0 = []
42 l2 = [0, 1, 2]
43 a0 = self.type2test(l0)
44 a2 = self.type2test(l2)
45
46 self.assertEqual(str(a0), str(l0))
47 self.assertEqual(repr(a0), repr(l0))
Brett Cannon0b70cca2006-08-25 02:59:59 +000048 self.assertEqual(repr(a2), repr(l2))
Walter Dörwald1dde95d2003-12-08 11:38:45 +000049 self.assertEqual(str(a2), "[0, 1, 2]")
50 self.assertEqual(repr(a2), "[0, 1, 2]")
51
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000052 a2.append(a2)
53 a2.append(3)
54 self.assertEqual(str(a2), "[0, 1, 2, [...], 3]")
55 self.assertEqual(repr(a2), "[0, 1, 2, [...], 3]")
56
Thomas Wouters1b7f8912007-09-19 03:06:30 +000057 l0 = []
58 for i in range(sys.getrecursionlimit() + 100):
59 l0 = [l0]
60 self.assertRaises(RuntimeError, repr, l0)
61
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000062 def test_print(self):
Guido van Rossum805365e2007-05-07 22:24:25 +000063 d = self.type2test(range(200))
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000064 d.append(d)
Guido van Rossum805365e2007-05-07 22:24:25 +000065 d.extend(range(200,400))
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000066 d.append(d)
67 d.append(400)
68 try:
Benjamin Petersonee8712c2008-05-20 21:35:26 +000069 fo = open(support.TESTFN, "w")
Guido van Rossum374812c2007-02-09 22:11:20 +000070 fo.write(str(d))
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000071 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +000072 fo = open(support.TESTFN, "r")
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000073 self.assertEqual(fo.read(), repr(d))
74 finally:
75 fo.close()
Benjamin Petersonee8712c2008-05-20 21:35:26 +000076 os.remove(support.TESTFN)
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000077
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000078 def test_set_subscript(self):
79 a = self.type2test(range(20))
80 self.assertRaises(ValueError, a.__setitem__, slice(0, 10, 0), [1,2,3])
81 self.assertRaises(TypeError, a.__setitem__, slice(0, 10), 1)
82 self.assertRaises(ValueError, a.__setitem__, slice(0, 10, 2), [1,2])
83 self.assertRaises(TypeError, a.__getitem__, 'x', 1)
84 a[slice(2,10,3)] = [1,2,3]
85 self.assertEqual(a, self.type2test([0, 1, 1, 3, 4, 2, 6, 7, 3,
86 9, 10, 11, 12, 13, 14, 15,
87 16, 17, 18, 19]))
88
89 def test_reversed(self):
90 a = self.type2test(range(20))
91 r = reversed(a)
92 self.assertEqual(list(r), self.type2test(range(19, -1, -1)))
Georg Brandla18af4e2007-04-21 15:47:16 +000093 self.assertRaises(StopIteration, next, r)
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000094 self.assertEqual(list(reversed(self.type2test())),
95 self.type2test())
Raymond Hettingerf5b64112008-12-02 21:33:45 +000096 # Bug 3689: make sure list-reversed-iterator doesn't have __len__
97 self.assertRaises(TypeError, len, reversed([1,2,3]))
Raymond Hettingerbcab2b22004-09-29 08:03:17 +000098
Walter Dörwald1dde95d2003-12-08 11:38:45 +000099 def test_setitem(self):
100 a = self.type2test([0, 1])
101 a[0] = 0
102 a[1] = 100
103 self.assertEqual(a, self.type2test([0, 100]))
104 a[-1] = 200
105 self.assertEqual(a, self.type2test([0, 200]))
106 a[-2] = 100
107 self.assertEqual(a, self.type2test([100, 200]))
108 self.assertRaises(IndexError, a.__setitem__, -3, 200)
109 self.assertRaises(IndexError, a.__setitem__, 2, 200)
110
111 a = self.type2test([])
112 self.assertRaises(IndexError, a.__setitem__, 0, 200)
113 self.assertRaises(IndexError, a.__setitem__, -1, 200)
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000114 self.assertRaises(TypeError, a.__setitem__)
115
116 a = self.type2test([0,1,2,3,4])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000117 a[0] = 1
118 a[1] = 2
119 a[2] = 3
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000120 self.assertEqual(a, self.type2test([1,2,3,3,4]))
121 a[0] = 5
122 a[1] = 6
123 a[2] = 7
124 self.assertEqual(a, self.type2test([5,6,7,3,4]))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000125 a[-2] = 88
126 a[-1] = 99
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000127 self.assertEqual(a, self.type2test([5,6,7,88,99]))
128 a[-2] = 8
129 a[-1] = 9
130 self.assertEqual(a, self.type2test([5,6,7,8,9]))
131
132 def test_delitem(self):
133 a = self.type2test([0, 1])
134 del a[1]
135 self.assertEqual(a, [0])
136 del a[0]
137 self.assertEqual(a, [])
138
139 a = self.type2test([0, 1])
140 del a[-2]
141 self.assertEqual(a, [1])
142 del a[-1]
143 self.assertEqual(a, [])
144
145 a = self.type2test([0, 1])
146 self.assertRaises(IndexError, a.__delitem__, -3)
147 self.assertRaises(IndexError, a.__delitem__, 2)
148
149 a = self.type2test([])
150 self.assertRaises(IndexError, a.__delitem__, 0)
151
152 self.assertRaises(TypeError, a.__delitem__)
153
154 def test_setslice(self):
155 l = [0, 1]
156 a = self.type2test(l)
157
158 for i in range(-3, 4):
159 a[:i] = l[:i]
160 self.assertEqual(a, l)
161 a2 = a[:]
162 a2[:i] = a[:i]
163 self.assertEqual(a2, a)
164 a[i:] = l[i:]
165 self.assertEqual(a, l)
166 a2 = a[:]
167 a2[i:] = a[i:]
168 self.assertEqual(a2, a)
169 for j in range(-3, 4):
170 a[i:j] = l[i:j]
171 self.assertEqual(a, l)
172 a2 = a[:]
173 a2[i:j] = a[i:j]
174 self.assertEqual(a2, a)
175
176 aa2 = a2[:]
177 aa2[:0] = [-2, -1]
178 self.assertEqual(aa2, [-2, -1, 0, 1])
179 aa2[0:] = []
180 self.assertEqual(aa2, [])
181
182 a = self.type2test([1, 2, 3, 4, 5])
183 a[:-1] = a
184 self.assertEqual(a, self.type2test([1, 2, 3, 4, 5, 5]))
185 a = self.type2test([1, 2, 3, 4, 5])
186 a[1:] = a
187 self.assertEqual(a, self.type2test([1, 1, 2, 3, 4, 5]))
188 a = self.type2test([1, 2, 3, 4, 5])
189 a[1:-1] = a
190 self.assertEqual(a, self.type2test([1, 1, 2, 3, 4, 5, 5]))
191
192 a = self.type2test([])
193 a[:] = tuple(range(10))
194 self.assertEqual(a, self.type2test(range(10)))
195
Thomas Woutersed03b412007-08-28 21:37:11 +0000196 self.assertRaises(TypeError, a.__setitem__, slice(0, 1, 5))
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000197
Thomas Woutersed03b412007-08-28 21:37:11 +0000198 self.assertRaises(TypeError, a.__setitem__)
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000199
200 def test_delslice(self):
201 a = self.type2test([0, 1])
202 del a[1:2]
203 del a[0:1]
204 self.assertEqual(a, self.type2test([]))
205
206 a = self.type2test([0, 1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000207 del a[1:2]
208 del a[0:1]
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000209 self.assertEqual(a, self.type2test([]))
210
211 a = self.type2test([0, 1])
212 del a[-2:-1]
213 self.assertEqual(a, self.type2test([1]))
214
215 a = self.type2test([0, 1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000216 del a[-2:-1]
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000217 self.assertEqual(a, self.type2test([1]))
218
219 a = self.type2test([0, 1])
220 del a[1:]
221 del a[:1]
222 self.assertEqual(a, self.type2test([]))
223
224 a = self.type2test([0, 1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000225 del a[1:]
226 del a[:1]
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000227 self.assertEqual(a, self.type2test([]))
228
229 a = self.type2test([0, 1])
230 del a[-1:]
231 self.assertEqual(a, self.type2test([0]))
232
233 a = self.type2test([0, 1])
Guido van Rossume2a383d2007-01-15 16:59:06 +0000234 del a[-1:]
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000235 self.assertEqual(a, self.type2test([0]))
236
237 a = self.type2test([0, 1])
238 del a[:]
239 self.assertEqual(a, self.type2test([]))
240
241 def test_append(self):
242 a = self.type2test([])
243 a.append(0)
244 a.append(1)
245 a.append(2)
246 self.assertEqual(a, self.type2test([0, 1, 2]))
247
248 self.assertRaises(TypeError, a.append)
249
250 def test_extend(self):
251 a1 = self.type2test([0])
252 a2 = self.type2test((0, 1))
253 a = a1[:]
254 a.extend(a2)
255 self.assertEqual(a, a1 + a2)
256
257 a.extend(self.type2test([]))
258 self.assertEqual(a, a1 + a2)
259
260 a.extend(a)
261 self.assertEqual(a, self.type2test([0, 0, 1, 0, 0, 1]))
262
263 a = self.type2test("spam")
264 a.extend("eggs")
265 self.assertEqual(a, list("spameggs"))
266
267 self.assertRaises(TypeError, a.extend, None)
268
269 self.assertRaises(TypeError, a.extend)
270
271 def test_insert(self):
272 a = self.type2test([0, 1, 2])
273 a.insert(0, -2)
274 a.insert(1, -1)
275 a.insert(2, 0)
276 self.assertEqual(a, [-2, -1, 0, 0, 1, 2])
277
278 b = a[:]
279 b.insert(-2, "foo")
280 b.insert(-200, "left")
281 b.insert(200, "right")
282 self.assertEqual(b, self.type2test(["left",-2,-1,0,0,"foo",1,2,"right"]))
283
284 self.assertRaises(TypeError, a.insert)
285
286 def test_pop(self):
287 a = self.type2test([-1, 0, 1])
288 a.pop()
289 self.assertEqual(a, [-1, 0])
290 a.pop(0)
291 self.assertEqual(a, [0])
292 self.assertRaises(IndexError, a.pop, 5)
293 a.pop(0)
294 self.assertEqual(a, [])
295 self.assertRaises(IndexError, a.pop)
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000296 self.assertRaises(TypeError, a.pop, 42, 42)
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000297 a = self.type2test([0, 10, 20, 30, 40])
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000298
299 def test_remove(self):
300 a = self.type2test([0, 0, 1])
301 a.remove(1)
302 self.assertEqual(a, [0, 0])
303 a.remove(0)
304 self.assertEqual(a, [0])
305 a.remove(0)
306 self.assertEqual(a, [])
307
308 self.assertRaises(ValueError, a.remove, 0)
Tim Peters13018922004-01-18 21:03:23 +0000309
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000310 self.assertRaises(TypeError, a.remove)
311
312 class BadExc(Exception):
313 pass
314
315 class BadCmp:
316 def __eq__(self, other):
317 if other == 2:
318 raise BadExc()
319 return False
320
321 a = self.type2test([0, 1, 2, 3])
322 self.assertRaises(BadExc, a.remove, BadCmp())
323
Walter Dörwald7355e812005-03-21 21:31:47 +0000324 class BadCmp2:
325 def __eq__(self, other):
326 raise BadExc()
327
328 d = self.type2test('abcdefghcij')
329 d.remove('c')
330 self.assertEqual(d, self.type2test('abdefghcij'))
331 d.remove('c')
332 self.assertEqual(d, self.type2test('abdefghij'))
333 self.assertRaises(ValueError, d.remove, 'c')
334 self.assertEqual(d, self.type2test('abdefghij'))
335
336 # Handle comparison errors
337 d = self.type2test(['a', 'b', BadCmp2(), 'c'])
338 e = self.type2test(d)
339 self.assertRaises(BadExc, d.remove, 'c')
340 for x, y in zip(d, e):
341 # verify that original order and values are retained.
342 self.assert_(x is y)
343
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000344 def test_count(self):
345 a = self.type2test([0, 1, 2])*3
346 self.assertEqual(a.count(0), 3)
347 self.assertEqual(a.count(1), 3)
348 self.assertEqual(a.count(3), 0)
349
350 self.assertRaises(TypeError, a.count)
Tim Peters13018922004-01-18 21:03:23 +0000351
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000352 class BadExc(Exception):
353 pass
354
355 class BadCmp:
356 def __eq__(self, other):
357 if other == 2:
358 raise BadExc()
359 return False
360
361 self.assertRaises(BadExc, a.count, BadCmp())
362
363 def test_index(self):
364 u = self.type2test([0, 1])
365 self.assertEqual(u.index(0), 0)
366 self.assertEqual(u.index(1), 1)
367 self.assertRaises(ValueError, u.index, 2)
368
369 u = self.type2test([-2, -1, 0, 0, 1, 2])
370 self.assertEqual(u.count(0), 2)
371 self.assertEqual(u.index(0), 2)
372 self.assertEqual(u.index(0, 2), 2)
373 self.assertEqual(u.index(-2, -10), 0)
374 self.assertEqual(u.index(0, 3), 3)
375 self.assertEqual(u.index(0, 3, 4), 3)
376 self.assertRaises(ValueError, u.index, 2, 0, -10)
377
378 self.assertRaises(TypeError, u.index)
379
380 class BadExc(Exception):
381 pass
382
383 class BadCmp:
384 def __eq__(self, other):
385 if other == 2:
386 raise BadExc()
387 return False
388
389 a = self.type2test([0, 1, 2, 3])
390 self.assertRaises(BadExc, a.index, BadCmp())
391
392 a = self.type2test([-2, -1, 0, 0, 1, 2])
393 self.assertEqual(a.index(0), 2)
394 self.assertEqual(a.index(0, 2), 2)
395 self.assertEqual(a.index(0, -4), 2)
396 self.assertEqual(a.index(-2, -10), 0)
397 self.assertEqual(a.index(0, 3), 3)
398 self.assertEqual(a.index(0, -3), 3)
399 self.assertEqual(a.index(0, 3, 4), 3)
400 self.assertEqual(a.index(0, -3, -2), 3)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000401 self.assertEqual(a.index(0, -4*sys.maxsize, 4*sys.maxsize), 2)
402 self.assertRaises(ValueError, a.index, 0, 4*sys.maxsize,-4*sys.maxsize)
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000403 self.assertRaises(ValueError, a.index, 2, 0, -10)
404 a.remove(0)
405 self.assertRaises(ValueError, a.index, 2, 0, 4)
406 self.assertEqual(a, self.type2test([-2, -1, 0, 1, 2]))
407
Neal Norwitzf0769532004-08-13 03:18:29 +0000408 # Test modifying the list during index's iteration
409 class EvilCmp:
410 def __init__(self, victim):
411 self.victim = victim
412 def __eq__(self, other):
413 del self.victim[:]
414 return False
415 a = self.type2test()
Guido van Rossum805365e2007-05-07 22:24:25 +0000416 a[:] = [EvilCmp(a) for _ in range(100)]
Neal Norwitzf0769532004-08-13 03:18:29 +0000417 # This used to seg fault before patch #1005778
418 self.assertRaises(ValueError, a.index, None)
419
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000420 def test_reverse(self):
421 u = self.type2test([-2, -1, 0, 1, 2])
422 u2 = u[:]
423 u.reverse()
424 self.assertEqual(u, [2, 1, 0, -1, -2])
425 u.reverse()
426 self.assertEqual(u, u2)
Tim Peters13018922004-01-18 21:03:23 +0000427
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000428 self.assertRaises(TypeError, u.reverse, 42)
429
430 def test_sort(self):
431 u = self.type2test([1, 0])
432 u.sort()
433 self.assertEqual(u, [0, 1])
Tim Peters13018922004-01-18 21:03:23 +0000434
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000435 u = self.type2test([2,1,0,-1,-2])
436 u.sort()
437 self.assertEqual(u, self.type2test([-2,-1,0,1,2]))
Tim Peters13018922004-01-18 21:03:23 +0000438
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000439 self.assertRaises(TypeError, u.sort, 42, 42)
440
441 def revcmp(a, b):
442 return cmp(b, a)
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000443 u.sort(key=CmpToKey(revcmp))
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000444 self.assertEqual(u, self.type2test([2,1,0,-1,-2]))
445
446 # The following dumps core in unpatched Python 1.5:
447 def myComparison(x,y):
448 return cmp(x%3, y%7)
449 z = self.type2test(range(12))
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000450 z.sort(key=CmpToKey(myComparison))
Tim Peters13018922004-01-18 21:03:23 +0000451
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000452 self.assertRaises(TypeError, z.sort, 2)
Tim Peters13018922004-01-18 21:03:23 +0000453
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000454 def selfmodifyingComparison(x,y):
455 z.append(1)
456 return cmp(x, y)
Raymond Hettinger70b64fc2008-01-30 20:15:17 +0000457 self.assertRaises(ValueError, z.sort, key=CmpToKey(selfmodifyingComparison))
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000458
459 self.assertRaises(TypeError, z.sort, 42, 42, 42, 42)
460
461 def test_slice(self):
462 u = self.type2test("spam")
463 u[:2] = "h"
464 self.assertEqual(u, list("ham"))
465
466 def test_iadd(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000467 super().test_iadd()
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000468 u = self.type2test([0, 1])
469 u2 = u
470 u += [2, 3]
471 self.assert_(u is u2)
472
473 u = self.type2test("spam")
474 u += "eggs"
475 self.assertEqual(u, self.type2test("spameggs"))
476
477 self.assertRaises(TypeError, u.__iadd__, None)
478
479 def test_imul(self):
480 u = self.type2test([0, 1])
481 u *= 3
482 self.assertEqual(u, self.type2test([0, 1, 0, 1, 0, 1]))
483 u *= 0
484 self.assertEqual(u, self.type2test([]))
Raymond Hettingerbcab2b22004-09-29 08:03:17 +0000485 s = self.type2test([])
486 oldid = id(s)
487 s *= 10
488 self.assertEqual(id(s), oldid)
Walter Dörwald1dde95d2003-12-08 11:38:45 +0000489
490 def test_extendedslicing(self):
491 # subscript
492 a = self.type2test([0,1,2,3,4])
493
494 # deletion
495 del a[::2]
496 self.assertEqual(a, self.type2test([1,3]))
497 a = self.type2test(range(5))
498 del a[1::2]
499 self.assertEqual(a, self.type2test([0,2,4]))
500 a = self.type2test(range(5))
501 del a[1::-2]
502 self.assertEqual(a, self.type2test([0,2,3,4]))
503 a = self.type2test(range(10))
504 del a[::1000]
505 self.assertEqual(a, self.type2test([1, 2, 3, 4, 5, 6, 7, 8, 9]))
506 # assignment
507 a = self.type2test(range(10))
508 a[::2] = [-1]*5
509 self.assertEqual(a, self.type2test([-1, 1, -1, 3, -1, 5, -1, 7, -1, 9]))
510 a = self.type2test(range(10))
511 a[::-4] = [10]*3
512 self.assertEqual(a, self.type2test([0, 10, 2, 3, 4, 10, 6, 7, 8 ,10]))
513 a = self.type2test(range(4))
514 a[::-1] = a
515 self.assertEqual(a, self.type2test([3, 2, 1, 0]))
516 a = self.type2test(range(10))
517 b = a[:]
518 c = a[:]
519 a[2:3] = self.type2test(["two", "elements"])
520 b[slice(2,3)] = self.type2test(["two", "elements"])
521 c[2:3:] = self.type2test(["two", "elements"])
522 self.assertEqual(a, b)
523 self.assertEqual(a, c)
524 a = self.type2test(range(10))
525 a[::2] = tuple(range(5))
526 self.assertEqual(a, self.type2test([0, 1, 1, 3, 2, 5, 3, 7, 4, 9]))
Raymond Hettingera710b332005-08-21 11:03:59 +0000527
528 def test_constructor_exception_handling(self):
529 # Bug #1242657
530 class F(object):
531 def __iter__(self):
Raymond Hettingera710b332005-08-21 11:03:59 +0000532 raise KeyboardInterrupt
533 self.assertRaises(KeyboardInterrupt, list, F())