You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
3.5 KiB

4 years ago
  1. from collections import abc
  2. from collections.abc import Set, Iterable
  3. def _abc_itemsview_register(view_cls):
  4. abc.ItemsView.register(view_cls)
  5. def _abc_keysview_register(view_cls):
  6. abc.KeysView.register(view_cls)
  7. def _abc_valuesview_register(view_cls):
  8. abc.ValuesView.register(view_cls)
  9. def _viewbaseset_richcmp(view, other, op):
  10. if op == 0: # <
  11. if not isinstance(other, Set):
  12. return NotImplemented
  13. return len(view) < len(other) and view <= other
  14. elif op == 1: # <=
  15. if not isinstance(other, Set):
  16. return NotImplemented
  17. if len(view) > len(other):
  18. return False
  19. for elem in view:
  20. if elem not in other:
  21. return False
  22. return True
  23. elif op == 2: # ==
  24. if not isinstance(other, Set):
  25. return NotImplemented
  26. return len(view) == len(other) and view <= other
  27. elif op == 3: # !=
  28. return not view == other
  29. elif op == 4: # >
  30. if not isinstance(other, Set):
  31. return NotImplemented
  32. return len(view) > len(other) and view >= other
  33. elif op == 5: # >=
  34. if not isinstance(other, Set):
  35. return NotImplemented
  36. if len(view) < len(other):
  37. return False
  38. for elem in other:
  39. if elem not in view:
  40. return False
  41. return True
  42. def _viewbaseset_and(view, other):
  43. if not isinstance(other, Iterable):
  44. return NotImplemented
  45. if isinstance(view, Set):
  46. view = set(iter(view))
  47. if isinstance(other, Set):
  48. other = set(iter(other))
  49. if not isinstance(other, Set):
  50. other = set(iter(other))
  51. return view & other
  52. def _viewbaseset_or(view, other):
  53. if not isinstance(other, Iterable):
  54. return NotImplemented
  55. if isinstance(view, Set):
  56. view = set(iter(view))
  57. if isinstance(other, Set):
  58. other = set(iter(other))
  59. if not isinstance(other, Set):
  60. other = set(iter(other))
  61. return view | other
  62. def _viewbaseset_sub(view, other):
  63. if not isinstance(other, Iterable):
  64. return NotImplemented
  65. if isinstance(view, Set):
  66. view = set(iter(view))
  67. if isinstance(other, Set):
  68. other = set(iter(other))
  69. if not isinstance(other, Set):
  70. other = set(iter(other))
  71. return view - other
  72. def _viewbaseset_xor(view, other):
  73. if not isinstance(other, Iterable):
  74. return NotImplemented
  75. if isinstance(view, Set):
  76. view = set(iter(view))
  77. if isinstance(other, Set):
  78. other = set(iter(other))
  79. if not isinstance(other, Set):
  80. other = set(iter(other))
  81. return view ^ other
  82. def _itemsview_isdisjoint(view, other):
  83. 'Return True if two sets have a null intersection.'
  84. for v in other:
  85. if v in view:
  86. return False
  87. return True
  88. def _itemsview_repr(view):
  89. lst = []
  90. for k, v in view:
  91. lst.append("{!r}: {!r}".format(k, v))
  92. body = ', '.join(lst)
  93. return '{}({})'.format(view.__class__.__name__, body)
  94. def _keysview_isdisjoint(view, other):
  95. 'Return True if two sets have a null intersection.'
  96. for k in other:
  97. if k in view:
  98. return False
  99. return True
  100. def _keysview_repr(view):
  101. lst = []
  102. for k in view:
  103. lst.append("{!r}".format(k))
  104. body = ', '.join(lst)
  105. return '{}({})'.format(view.__class__.__name__, body)
  106. def _valuesview_repr(view):
  107. lst = []
  108. for v in view:
  109. lst.append("{!r}".format(v))
  110. body = ', '.join(lst)
  111. return '{}({})'.format(view.__class__.__name__, body)