@@ -331,7 +331,181 @@ def test_dictview_set_operations_on_keys():
331
331
assert k1 | k2 == {1 , 2 , 3 }
332
332
assert k1 ^ k2 == {3 }
333
333
assert k1 ^ k3 == {1 , 2 , 4 }
334
-
334
+
335
+ def test_dictview_keys_operations ():
336
+ d1 = {'a' : 1 , 'b' : 2 }
337
+
338
+ # &
339
+ assert d1 .keys () & 'b' == {'b' }
340
+ assert d1 .keys () & 'ab' == {'a' , 'b' }
341
+ assert d1 .keys () & ['a' ] == {'a' }
342
+ assert d1 .keys () & ['a' , 'b' ] == {'a' , 'b' }
343
+ assert d1 .keys () & [1 , 2 ] == set ()
344
+ assert d1 .keys () & ('a' ) == {'a' }
345
+ assert d1 .keys () & ('a' , 'b' ) == {'a' , 'b' }
346
+ assert d1 .keys () & {('a' , 1 )} == set ()
347
+ assert d1 .keys () & d1 == {'a' , 'b' }
348
+ assert d1 .keys () & d1 .values () == set ()
349
+ assert d1 .keys () & {1 :'a' , 2 :'b' }.values () == {'a' , 'b' }
350
+ assert {1 :1 , 2 :2 }.keys () & range (1 ,3 ) == {1 , 2 }
351
+
352
+ def chargen (c1 , c2 ):
353
+ for c in range (ord (c1 ), ord (c2 )+ 1 ):
354
+ yield chr (c )
355
+ assert d1 .keys () & chargen ('a' , 'b' ) == {'a' , 'b' }
356
+
357
+ assert_raises (TypeError , lambda : d1 .keys () & 1 )
358
+ class TC :
359
+ pass
360
+ assert_raises (TypeError , lambda : d1 .keys () & TC ())
361
+
362
+ # |
363
+ assert d1 .keys () | 'b' == {'a' , 'b' }
364
+ assert d1 .keys () | 'bc' == {'a' , 'c' , 'b' }
365
+ assert d1 .keys () | ['a' ] == {'a' , 'b' }
366
+ assert d1 .keys () | ['a' , 'b' ] == {'a' , 'b' }
367
+ assert d1 .keys () | ['c' , 'b' ] == {'a' , 'c' , 'b' }
368
+ assert d1 .keys () | [1 , 2 ] == {'a' , 1 , 2 , 'b' }
369
+ assert d1 .keys () | ('a' ) == {'a' , 'b' }
370
+ assert d1 .keys () | ('a' , 'b' ) == {'a' , 'b' }
371
+ assert d1 .keys () | {('a' , 1 )} == {'a' , ('a' , 1 ), 'b' }
372
+ assert d1 .keys () | d1 == {'a' , 'b' }
373
+ assert d1 .keys () | d1 .values () == {'a' , 1 , 2 , 'b' }
374
+ assert d1 .keys () | {1 :'a' , 2 :'b' }.values () == {'a' , 'b' }
375
+ assert {1 :1 , 2 :2 }.keys () | range (1 ,3 ) == {1 , 2 }
376
+
377
+ assert d1 .keys () | chargen ('a' , 'c' ) == {'a' , 'b' , 'c' }
378
+
379
+ assert_raises (TypeError , lambda : d1 .keys () | 1 )
380
+ assert_raises (TypeError , lambda : d1 .keys () | TC ())
381
+
382
+ # ^
383
+ assert d1 .keys () ^ 'a' == {'b' }
384
+ assert d1 .keys () ^ "ab" == set ()
385
+ assert d1 .keys () ^ ['a' ] == {'b' }
386
+ assert d1 .keys () ^ ['a' , 'b' ] == set ()
387
+ assert d1 .keys () ^ [1 , 2 ] == {'a' , 1 , 2 , 'b' }
388
+ assert d1 .keys () ^ ('a' ) == {'b' }
389
+ assert d1 .keys () ^ ('a' , 'b' ) == set ()
390
+ assert d1 .keys () ^ {('a' , 1 )} == {'a' , ('a' , 1 ), 'b' }
391
+ assert d1 .keys () ^ d1 == set ()
392
+ assert d1 .keys () ^ d1 .values () == {'a' , 1 , 2 , 'b' }
393
+ assert d1 .keys () ^ {1 :'a' , 2 :'b' }.values () == set ()
394
+ assert {1 :1 , 2 :2 }.keys () ^ range (1 ,3 ) == set ()
395
+
396
+ assert d1 .keys () ^ chargen ('b' , 'c' ) == {'a' , 'c' }
397
+
398
+ assert_raises (TypeError , lambda : d1 .keys () ^ 1 )
399
+ assert_raises (TypeError , lambda : d1 .keys () ^ TC ())
400
+
401
+ # -
402
+ assert d1 .keys () - 'a' == {'b' }
403
+ assert d1 .keys () - "ab" == set ()
404
+ assert d1 .keys () - ['a' ] == {'b' }
405
+ assert d1 .keys () - ['a' , 'b' ] == set ()
406
+ assert d1 .keys () - [1 , 2 ] == {'a' , 'b' }
407
+ assert d1 .keys () - ('a' ) == {'b' }
408
+ assert d1 .keys () - ('a' , 'b' ) == set ()
409
+ assert d1 .keys () - {('a' , 1 )} == {'a' , 'b' }
410
+ assert d1 .keys () - d1 == set ()
411
+ assert d1 .keys () - d1 .values () == {'a' , 'b' }
412
+ assert d1 .keys () - {1 :'a' , 2 :'b' }.values () == set ()
413
+ assert {1 :1 , 2 :2 }.keys () - range (1 ,3 ) == set ()
414
+
415
+ assert d1 .keys () - chargen ('b' , 'c' ) == {'a' }
416
+
417
+ assert_raises (TypeError , lambda : d1 .keys () - 1 )
418
+ assert_raises (TypeError , lambda : d1 .keys () - TC ())
419
+
420
+ def test_dictview_items_operations ():
421
+ d1 = {'a' : 1 , 'b' : 2 }
422
+
423
+ # &
424
+ assert d1 .items () & 'b' == set ()
425
+ assert d1 .items () & "ab" == set ()
426
+ assert d1 .items () & ['a' ] == set ()
427
+ assert d1 .items () & ['a' , 'b' ] == set ()
428
+ assert d1 .items () & [1 , 2 ] == set ()
429
+ assert d1 .items () & ('a' ) == set ()
430
+ assert d1 .items () & ('a' , 'b' ) == set ()
431
+ assert d1 .items () & {('a' , 1 )} == {('a' , 1 )}
432
+ assert d1 .items () & d1 == set ()
433
+ assert d1 .items () & d1 .values () == set ()
434
+ assert d1 .items () & {1 :'a' , 2 :'b' }.values () == set ()
435
+ assert d1 .items () & tuple (d1 .items ()) == {('a' , 1 ), ('b' , 2 )}
436
+ assert d1 .items () & tuple (('a' , 1 )) == set ()
437
+ assert {1 :1 , 2 :2 }.items () & range (1 ,3 ) == set ()
438
+
439
+ def tuplegen (i , c1 , c2 ):
440
+ for c in range (ord (c1 ), ord (c2 )+ 1 ):
441
+ i += 1
442
+ yield (chr (c ), i )
443
+
444
+ assert d1 .items () & tuplegen (0 , 'a' , 'b' ) == {('a' , 1 ), ('b' , 2 )}
445
+
446
+ assert_raises (TypeError , lambda : d1 .items () & 1 )
447
+ class TC :
448
+ pass
449
+ assert_raises (TypeError , lambda : d1 .items () & TC ())
450
+
451
+ # |
452
+ assert d1 .items () | 'b' == {('a' , 1 ), ('b' , 2 ), 'b' }
453
+ assert d1 .items () | "ab" == {('a' , 1 ), ('b' , 2 ), 'a' , 'b' }
454
+ assert d1 .items () | ['a' ] == {('a' , 1 ), ('b' , 2 ), 'a' }
455
+ assert d1 .items () | ['a' , 'b' ] == {('a' , 1 ), ('b' , 2 ), 'a' , 'b' }
456
+ assert d1 .items () | [1 , 2 ] == {('a' , 1 ), ('b' , 2 ), 1 , 2 }
457
+ assert d1 .items () | ('a' ) == {('a' , 1 ), ('b' , 2 ), 'a' }
458
+ assert d1 .items () | ('a' , 'b' ) == {('a' , 1 ), ('b' , 2 ), 'a' , 'b' }
459
+ assert d1 .items () | {('a' , 1 )} == {('a' , 1 ), ('b' , 2 )}
460
+ assert d1 .items () | d1 == {('a' , 1 ), ('b' , 2 ), 'a' , 'b' }
461
+ assert d1 .items () | d1 .values () == {('a' , 1 ), ('b' , 2 ), 1 , 2 }
462
+ assert d1 .items () | {1 :'a' , 2 :'b' }.values () == {('a' , 1 ), ('b' , 2 ), 'a' , 'b' }
463
+ assert d1 .items () | tuple (d1 .items ()) == {('a' , 1 ), ('b' , 2 )}
464
+ assert d1 .items () | tuple (('a' , 1 )) == {('a' , 1 ), ('b' , 2 ), 'a' , 1 }
465
+ assert {1 :1 , 2 :2 }.items () | range (1 ,3 ) == {1 , 2 , (1 , 1 ), (2 , 2 )}
466
+
467
+ assert d1 .items () | tuplegen (0 , 'a' , 'c' ) == {('a' , 1 ), ('b' , 2 ), ('c' , 3 )}
468
+
469
+ assert_raises (TypeError , lambda : d1 .items () | 1 )
470
+ assert_raises (TypeError , lambda : d1 .items () | TC ())
471
+
472
+ # ^
473
+ assert d1 .items () ^ 'a' == {('a' , 1 ), 'a' , ('b' , 2 )}
474
+ assert d1 .items () ^ "ab" == {('a' , 1 ), 'a' , ('b' , 2 ), 'b' }
475
+ assert d1 .items () ^ ['a' ] == {('a' , 1 ), 'a' , ('b' , 2 )}
476
+ assert d1 .items () ^ ['a' , 'b' ] == {('a' , 1 ), 'a' , ('b' , 2 ), 'b' }
477
+ assert d1 .items () ^ [1 , 2 ] == {('a' , 1 ), 1 , 2 , ('b' , 2 )}
478
+ assert d1 .items () ^ ('a' ) == {('a' , 1 ), 'a' , ('b' , 2 )}
479
+ assert d1 .items () ^ ('a' , 'b' ) == {('a' , 1 ), 'a' , ('b' , 2 ), 'b' }
480
+ assert d1 .items () ^ {('a' , 1 )} == {('b' , 2 )}
481
+ assert d1 .items () ^ d1 == {('a' , 1 ), 'a' , ('b' , 2 ), 'b' }
482
+ assert d1 .items () ^ d1 .values () == {('a' , 1 ), 1 , 2 , ('b' , 2 )}
483
+ assert d1 .items () ^ {1 :'a' , 2 :'b' }.values () == {('a' , 1 ), 'a' , ('b' , 2 ), 'b' }
484
+ assert {1 :1 , 2 :2 }.items () ^ range (1 ,3 ) == {1 , 2 , (1 , 1 ), (2 , 2 )}
485
+
486
+ assert d1 .items () ^ tuplegen (1 , 'b' , 'c' ) == {('a' , 1 ), ('c' , 3 )}
487
+
488
+ assert_raises (TypeError , lambda : d1 .items () ^ 1 )
489
+ assert_raises (TypeError , lambda : d1 .items () ^ TC ())
490
+
491
+ # -
492
+ assert d1 .items () - 'a' == {('a' , 1 ), ('b' , 2 )}
493
+ assert d1 .items () - "ab" == {('a' , 1 ), ('b' , 2 )}
494
+ assert d1 .items () - ['a' ] == {('a' , 1 ), ('b' , 2 )}
495
+ assert d1 .items () - ['a' , 'b' ] == {('a' , 1 ), ('b' , 2 )}
496
+ assert d1 .items () - [1 , 2 ] == {('a' , 1 ), ('b' , 2 )}
497
+ assert d1 .items () - ('a' ) == {('a' , 1 ), ('b' , 2 )}
498
+ assert d1 .items () - ('a' , 'b' ) == {('a' , 1 ), ('b' , 2 )}
499
+ assert d1 .items () - {('a' , 1 )} == {('b' , 2 )}
500
+ assert d1 .items () - d1 == {('a' , 1 ), ('b' , 2 )}
501
+ assert d1 .items () - d1 .values () == {('a' , 1 ), ('b' , 2 )}
502
+ assert d1 .items () - {1 :'a' , 2 :'b' }.values () == {('a' , 1 ), ('b' , 2 )}
503
+ assert {1 :1 , 2 :2 }.items () - range (1 ,3 ) == {(1 , 1 ), (2 , 2 )}
504
+
505
+ assert d1 .items () - tuplegen (1 , 'b' , 'c' ) == {('a' , 1 )}
506
+
507
+ assert_raises (TypeError , lambda : d1 .items () - 1 )
508
+ assert_raises (TypeError , lambda : d1 .items () - TC ())
335
509
336
510
def test_dictview_set_operations_on_items ():
337
511
k1 = {1 : 1 , 2 : 2 }.items ()
0 commit comments