annotate Lib/_abcoll.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents 3eeaecf005c1
children 8e95a078d490
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Copyright 2007 Google, Inc. All Rights Reserved.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 # Licensed to PSF under a Contributor Agreement.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 """Abstract Base Classes (ABCs) for collections, according to PEP 3119.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 DON'T USE THIS MODULE DIRECTLY! The classes here should be imported
42110
e4f649c4f457 Merged revisions 55962-56019 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42084
diff changeset
7 via collections; they are defined here only to alleviate certain
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 bootstrapping issues. Unit tests are in test_collections.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 """
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 from abc import ABCMeta, abstractmethod
48412
5f4a8980c1ac Merged revisions 64475,64544-64545,64550,64557-64558,64565,64570,64577,64582-64583,64585,64590,64592-64593,64625,64630,64638,64647,64655-64656,64663-64664 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45659
diff changeset
12 import sys
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
13
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 __all__ = ["Hashable", "Iterable", "Iterator",
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 "Sized", "Container", "Callable",
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 "Set", "MutableSet",
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 "Mapping", "MutableMapping",
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 "MappingView", "KeysView", "ItemsView", "ValuesView",
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 "Sequence", "MutableSequence",
43956
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
20 "ByteString",
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 ]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
22
44043
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
23
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
24 ### collection related types which are not exposed through builtin ###
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
25 ## iterators ##
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
26 bytes_iterator = type(iter(b''))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
27 bytearray_iterator = type(iter(bytearray()))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
28 #callable_iterator = ???
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
29 dict_keyiterator = type(iter({}.keys()))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
30 dict_valueiterator = type(iter({}.values()))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
31 dict_itemiterator = type(iter({}.items()))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
32 list_iterator = type(iter([]))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
33 list_reverseiterator = type(iter(reversed([])))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
34 range_iterator = type(iter(range(0)))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
35 set_iterator = type(iter(set()))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
36 str_iterator = type(iter(""))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
37 tuple_iterator = type(iter(()))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
38 zip_iterator = type(iter(zip()))
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
39 ## views ##
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
40 dict_keys = type({}.keys())
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
41 dict_values = type({}.values())
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
42 dict_items = type({}.items())
44049
15649aef2db5 Removed more types from the types module
Christian Heimes <christian@cheimes.de>
parents: 44043
diff changeset
43 ## misc ##
15649aef2db5 Removed more types from the types module
Christian Heimes <christian@cheimes.de>
parents: 44043
diff changeset
44 dict_proxy = type(type.__dict__)
44043
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
45
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
46
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 ### ONE-TRICK PONIES ###
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
48
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 class Hashable(metaclass=ABCMeta):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 def __hash__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 return 0
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 @classmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 def __subclasshook__(cls, C):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 if cls is Hashable:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 for B in C.__mro__:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 if "__hash__" in B.__dict__:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 if B.__dict__["__hash__"]:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 return True
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 break
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
65
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 class Iterable(metaclass=ABCMeta):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
67
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 def __iter__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 while False:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 yield None
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
72
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 @classmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 def __subclasshook__(cls, C):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 if cls is Iterable:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 if any("__iter__" in B.__dict__ for B in C.__mro__):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 return True
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
79
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
80
45245
8527ed7563d0 Merge r60679
Raymond Hettinger <python@rcn.com>
parents: 45241
diff changeset
81 class Iterator(Iterable):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
82
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 def __next__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 raise StopIteration
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
86
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 def __iter__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 return self
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
89
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 @classmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 def __subclasshook__(cls, C):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 if cls is Iterator:
66531
69ec77526180 Issue #10565: Iterator ABC should require both __next__ and __iter__.
Raymond Hettinger <python@rcn.com>
parents: 64265
diff changeset
93 if (any("__next__" in B.__dict__ for B in C.__mro__) and
69ec77526180 Issue #10565: Iterator ABC should require both __next__ and __iter__.
Raymond Hettinger <python@rcn.com>
parents: 64265
diff changeset
94 any("__iter__" in B.__dict__ for B in C.__mro__)):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 return True
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
97
44043
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
98 Iterator.register(bytes_iterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
99 Iterator.register(bytearray_iterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
100 #Iterator.register(callable_iterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
101 Iterator.register(dict_keyiterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
102 Iterator.register(dict_valueiterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
103 Iterator.register(dict_itemiterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
104 Iterator.register(list_iterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
105 Iterator.register(list_reverseiterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
106 Iterator.register(range_iterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
107 Iterator.register(set_iterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
108 Iterator.register(str_iterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
109 Iterator.register(tuple_iterator)
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
110 Iterator.register(zip_iterator)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
111
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 class Sized(metaclass=ABCMeta):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
113
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 def __len__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 return 0
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
117
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 @classmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 def __subclasshook__(cls, C):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 if cls is Sized:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 if any("__len__" in B.__dict__ for B in C.__mro__):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 return True
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
124
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
125
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 class Container(metaclass=ABCMeta):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
127
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 def __contains__(self, x):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 return False
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
131
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 @classmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 def __subclasshook__(cls, C):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 if cls is Container:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 if any("__contains__" in B.__dict__ for B in C.__mro__):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 return True
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
138
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
139
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 class Callable(metaclass=ABCMeta):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
141
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 @abstractmethod
45659
dd318c3f6cb7 Merged revisions 61209-61214,61217-61222,61224-61226,61233-61237 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45252
diff changeset
143 def __call__(self, *args, **kwds):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 return False
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
145
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 @classmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 def __subclasshook__(cls, C):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 if cls is Callable:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 if any("__call__" in B.__dict__ for B in C.__mro__):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 return True
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
152
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
153
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 ### SETS ###
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
155
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
156
45245
8527ed7563d0 Merge r60679
Raymond Hettinger <python@rcn.com>
parents: 45241
diff changeset
157 class Set(Sized, Iterable, Container):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
158
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 """A set is a finite, iterable container.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
160
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 This class provides concrete generic implementations of all
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 methods except for __contains__, __iter__ and __len__.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
163
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 To override the comparisons (presumably for speed, as the
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 semantics are fixed), all you have to do is redefine __le__ and
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 then the other operations will automatically follow suit.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 """
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
168
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 def __le__(self, other):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 if not isinstance(other, Set):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 if len(self) > len(other):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 return False
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 for elem in self:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 if elem not in other:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 return False
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 return True
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
178
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 def __lt__(self, other):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 if not isinstance(other, Set):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 return len(self) < len(other) and self.__le__(other)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
183
45241
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
184 def __gt__(self, other):
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
185 if not isinstance(other, Set):
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
186 return NotImplemented
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
187 return other < self
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
188
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
189 def __ge__(self, other):
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
190 if not isinstance(other, Set):
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
191 return NotImplemented
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
192 return other <= self
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
193
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 def __eq__(self, other):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 if not isinstance(other, Set):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 return len(self) == len(other) and self.__le__(other)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
198
45241
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
199 def __ne__(self, other):
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
200 return not (self == other)
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
201
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 @classmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 def _from_iterable(cls, it):
45199
0ba31cea6e03 Fix-up the _from_iterable() method to return instances of the subclass where it is used.
Raymond Hettinger <python@rcn.com>
parents: 45192
diff changeset
204 '''Construct an instance of the class from any iterable input.
0ba31cea6e03 Fix-up the _from_iterable() method to return instances of the subclass where it is used.
Raymond Hettinger <python@rcn.com>
parents: 45192
diff changeset
205
0ba31cea6e03 Fix-up the _from_iterable() method to return instances of the subclass where it is used.
Raymond Hettinger <python@rcn.com>
parents: 45192
diff changeset
206 Must override this method if the class constructor signature
45246
0f3d58f9cd35 Document how to use Set and MutableSet as a mixin.
Raymond Hettinger <python@rcn.com>
parents: 45245
diff changeset
207 does not accept an iterable for an input.
45199
0ba31cea6e03 Fix-up the _from_iterable() method to return instances of the subclass where it is used.
Raymond Hettinger <python@rcn.com>
parents: 45192
diff changeset
208 '''
45246
0f3d58f9cd35 Document how to use Set and MutableSet as a mixin.
Raymond Hettinger <python@rcn.com>
parents: 45245
diff changeset
209 return cls(it)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
210
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 def __and__(self, other):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 if not isinstance(other, Iterable):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 return self._from_iterable(value for value in other if value in self)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
215
45056
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
216 def isdisjoint(self, other):
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
217 for value in other:
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
218 if value in self:
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
219 return False
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
220 return True
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
221
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 def __or__(self, other):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 if not isinstance(other, Iterable):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 return NotImplemented
45659
dd318c3f6cb7 Merged revisions 61209-61214,61217-61222,61224-61226,61233-61237 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45252
diff changeset
225 chain = (e for s in (self, other) for e in s)
dd318c3f6cb7 Merged revisions 61209-61214,61217-61222,61224-61226,61233-61237 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45252
diff changeset
226 return self._from_iterable(chain)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
227
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 def __sub__(self, other):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 if not isinstance(other, Set):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 if not isinstance(other, Iterable):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 other = self._from_iterable(other)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 return self._from_iterable(value for value in self
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 if value not in other)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
235
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 def __xor__(self, other):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 if not isinstance(other, Set):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 if not isinstance(other, Iterable):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 return NotImplemented
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 other = self._from_iterable(other)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 return (self - other) | (other - self)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
242
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 def _hash(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 """Compute the hash value of a set.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
245
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 Note that we don't define __hash__: not all sets are hashable.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 But if you define a hashable set type, its __hash__ should
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 call this function.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
249
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 This must be compatible __eq__.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
251
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 All sets ought to compare equal if they contain the same
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 elements, regardless of how they are implemented, and
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 regardless of the order of the elements; so there's not much
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 freedom for __eq__ or __hash__. We match the algorithm used
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 by the built-in frozenset type.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
257 """
44160
9d152530910a Removed PyInt_GetMax and sys.maxint
Christian Heimes <christian@cheimes.de>
parents: 44049
diff changeset
258 MAX = sys.maxsize
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 MASK = 2 * MAX + 1
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 n = len(self)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 h = 1927868237 * (n + 1)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 h &= MASK
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 for x in self:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 hx = hash(x)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 h &= MASK
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 h = h * 69069 + 907133923
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 h &= MASK
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 if h > MAX:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 h -= MASK + 1
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 if h == -1:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 h = 590923713
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 return h
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
274
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 Set.register(frozenset)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
276
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
277
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 class MutableSet(Set):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
279
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 def add(self, value):
50812
a04b1c7167ba Merged revisions 68630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48412
diff changeset
282 """Add an element."""
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 raise NotImplementedError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
284
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 def discard(self, value):
50812
a04b1c7167ba Merged revisions 68630 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48412
diff changeset
287 """Remove an element. Do not raise an exception if absent."""
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 raise NotImplementedError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
289
45056
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
290 def remove(self, value):
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
291 """Remove an element. If not a member, raise a KeyError."""
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
292 if value not in self:
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
293 raise KeyError(value)
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
294 self.discard(value)
c8fca9b5cd3c Merged revisions 60408-60440 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44160
diff changeset
295
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 def pop(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 """Return the popped value. Raise KeyError if empty."""
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
298 it = iter(self)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 try:
51150
01b9c5d99ebe Beef-up tests for collections ABCs.
Raymond Hettinger <python@rcn.com>
parents: 50812
diff changeset
300 value = next(it)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 except StopIteration:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 raise KeyError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 self.discard(value)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 return value
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
305
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 def clear(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
307 """This is slow (creates N new iterators!) but effective."""
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 try:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 while True:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 self.pop()
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
311 except KeyError:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
312 pass
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
313
67561
3eeaecf005c1 Remove function annotations that slipped into _abcoll.
Raymond Hettinger <python@rcn.com>
parents: 66531
diff changeset
314 def __ior__(self, it):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 for value in it:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 self.add(value)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 return self
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
318
67561
3eeaecf005c1 Remove function annotations that slipped into _abcoll.
Raymond Hettinger <python@rcn.com>
parents: 66531
diff changeset
319 def __iand__(self, it):
52665
8dff406403be Issue #5647: MutableSet.__iand__() no longer mutates self during iteration.
Raymond Hettinger <python@rcn.com>
parents: 51888
diff changeset
320 for value in (self - it):
8dff406403be Issue #5647: MutableSet.__iand__() no longer mutates self during iteration.
Raymond Hettinger <python@rcn.com>
parents: 51888
diff changeset
321 self.discard(value)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
322 return self
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
323
67561
3eeaecf005c1 Remove function annotations that slipped into _abcoll.
Raymond Hettinger <python@rcn.com>
parents: 66531
diff changeset
324 def __ixor__(self, it):
64265
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
325 if it is self:
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
326 self.clear()
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
327 else:
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
328 if not isinstance(it, Set):
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
329 it = self._from_iterable(it)
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
330 for value in it:
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
331 if value in self:
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
332 self.discard(value)
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
333 else:
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
334 self.add(value)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 return self
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
336
67561
3eeaecf005c1 Remove function annotations that slipped into _abcoll.
Raymond Hettinger <python@rcn.com>
parents: 66531
diff changeset
337 def __isub__(self, it):
64265
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
338 if it is self:
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
339 self.clear()
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
340 else:
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
341 for value in it:
c1c4f8f85070 Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 64219
diff changeset
342 self.discard(value)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 return self
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
344
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 MutableSet.register(set)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
346
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
347
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 ### MAPPINGS ###
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
349
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
350
45245
8527ed7563d0 Merge r60679
Raymond Hettinger <python@rcn.com>
parents: 45241
diff changeset
351 class Mapping(Sized, Iterable, Container):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
352
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 def __getitem__(self, key):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 raise KeyError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
356
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 def get(self, key, default=None):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 try:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 return self[key]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 except KeyError:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 return default
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
362
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 def __contains__(self, key):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 try:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 self[key]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 except KeyError:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 return False
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 else:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 return True
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
370
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
371 def keys(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 return KeysView(self)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
373
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 def items(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
375 return ItemsView(self)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
376
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 def values(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
378 return ValuesView(self)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
379
45147
1beb7d293f55 Start replacing UserDict.DictMixin with collections.MutableMapping (the bsddb modules are next).
Raymond Hettinger <python@rcn.com>
parents: 45071
diff changeset
380 def __eq__(self, other):
61807
b0250ffa2267 Merged revisions 81414 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54195
diff changeset
381 if not isinstance(other, Mapping):
b0250ffa2267 Merged revisions 81414 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54195
diff changeset
382 return NotImplemented
b0250ffa2267 Merged revisions 81414 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 54195
diff changeset
383 return dict(self.items()) == dict(other.items())
45147
1beb7d293f55 Start replacing UserDict.DictMixin with collections.MutableMapping (the bsddb modules are next).
Raymond Hettinger <python@rcn.com>
parents: 45071
diff changeset
384
1beb7d293f55 Start replacing UserDict.DictMixin with collections.MutableMapping (the bsddb modules are next).
Raymond Hettinger <python@rcn.com>
parents: 45071
diff changeset
385 def __ne__(self, other):
45184
3ecd526c35c5 Convert test_userdict to use the collections.UserDict.
Raymond Hettinger <python@rcn.com>
parents: 45167
diff changeset
386 return not (self == other)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
387
45192
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45184
diff changeset
388
45252
a2bf2a59404a MappingView is Sized.
Raymond Hettinger <python@rcn.com>
parents: 45246
diff changeset
389 class MappingView(Sized):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
390
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 def __init__(self, mapping):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
392 self._mapping = mapping
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
393
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
394 def __len__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 return len(self._mapping)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
396
51888
c4f27e546cf5 Give mapping views a usable repr.
Raymond Hettinger <python@rcn.com>
parents: 51835
diff changeset
397 def __repr__(self):
c4f27e546cf5 Give mapping views a usable repr.
Raymond Hettinger <python@rcn.com>
parents: 51835
diff changeset
398 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
c4f27e546cf5 Give mapping views a usable repr.
Raymond Hettinger <python@rcn.com>
parents: 51835
diff changeset
399
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
400
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 class KeysView(MappingView, Set):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
402
64219
01b0a6cb13d4 Issue #9214: Fix set operations on KeysView and ItemsView.
Raymond Hettinger <python@rcn.com>
parents: 63341
diff changeset
403 @classmethod
01b0a6cb13d4 Issue #9214: Fix set operations on KeysView and ItemsView.
Raymond Hettinger <python@rcn.com>
parents: 63341
diff changeset
404 def _from_iterable(self, it):
01b0a6cb13d4 Issue #9214: Fix set operations on KeysView and ItemsView.
Raymond Hettinger <python@rcn.com>
parents: 63341
diff changeset
405 return set(it)
01b0a6cb13d4 Issue #9214: Fix set operations on KeysView and ItemsView.
Raymond Hettinger <python@rcn.com>
parents: 63341
diff changeset
406
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
407 def __contains__(self, key):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 return key in self._mapping
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
409
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 def __iter__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 for key in self._mapping:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 yield key
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
413
44043
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
414 KeysView.register(dict_keys)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
415
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
416
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 class ItemsView(MappingView, Set):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
418
64219
01b0a6cb13d4 Issue #9214: Fix set operations on KeysView and ItemsView.
Raymond Hettinger <python@rcn.com>
parents: 63341
diff changeset
419 @classmethod
01b0a6cb13d4 Issue #9214: Fix set operations on KeysView and ItemsView.
Raymond Hettinger <python@rcn.com>
parents: 63341
diff changeset
420 def _from_iterable(self, it):
01b0a6cb13d4 Issue #9214: Fix set operations on KeysView and ItemsView.
Raymond Hettinger <python@rcn.com>
parents: 63341
diff changeset
421 return set(it)
01b0a6cb13d4 Issue #9214: Fix set operations on KeysView and ItemsView.
Raymond Hettinger <python@rcn.com>
parents: 63341
diff changeset
422
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 def __contains__(self, item):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
424 key, value = item
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 try:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 v = self._mapping[key]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
427 except KeyError:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 return False
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 else:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
430 return v == value
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
431
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 def __iter__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 for key in self._mapping:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 yield (key, self._mapping[key])
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
435
44043
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
436 ItemsView.register(dict_items)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
437
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
438
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 class ValuesView(MappingView):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
440
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 def __contains__(self, value):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 for key in self._mapping:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
443 if value == self._mapping[key]:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 return True
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
445 return False
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
446
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
447 def __iter__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 for key in self._mapping:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 yield self._mapping[key]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
450
44043
1f024a95e9d9 Added view and iterator types to collections / _abcoll
Christian Heimes <christian@cheimes.de>
parents: 43956
diff changeset
451 ValuesView.register(dict_values)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
452
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
453
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
454 class MutableMapping(Mapping):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
455
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 def __setitem__(self, key, value):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 raise KeyError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
459
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
461 def __delitem__(self, key):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 raise KeyError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
463
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 __marker = object()
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
465
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 def pop(self, key, default=__marker):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 try:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
468 value = self[key]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 except KeyError:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
470 if default is self.__marker:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 raise
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 return default
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 else:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
474 del self[key]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
475 return value
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
476
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 def popitem(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
478 try:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
479 key = next(iter(self))
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
480 except StopIteration:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
481 raise KeyError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
482 value = self[key]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
483 del self[key]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
484 return key, value
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
485
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
486 def clear(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
487 try:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
488 while True:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
489 self.popitem()
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
490 except KeyError:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
491 pass
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
492
62971
06b3891a6395 Issue #9137: Fix issue in MutableMapping.update, which incorrectly
Mark Dickinson <dickinsm@gmail.com>
parents: 61807
diff changeset
493 def update(*args, **kwds):
06b3891a6395 Issue #9137: Fix issue in MutableMapping.update, which incorrectly
Mark Dickinson <dickinsm@gmail.com>
parents: 61807
diff changeset
494 if len(args) > 2:
06b3891a6395 Issue #9137: Fix issue in MutableMapping.update, which incorrectly
Mark Dickinson <dickinsm@gmail.com>
parents: 61807
diff changeset
495 raise TypeError("update() takes at most 2 positional "
06b3891a6395 Issue #9137: Fix issue in MutableMapping.update, which incorrectly
Mark Dickinson <dickinsm@gmail.com>
parents: 61807
diff changeset
496 "arguments ({} given)".format(len(args)))
06b3891a6395 Issue #9137: Fix issue in MutableMapping.update, which incorrectly
Mark Dickinson <dickinsm@gmail.com>
parents: 61807
diff changeset
497 elif not args:
06b3891a6395 Issue #9137: Fix issue in MutableMapping.update, which incorrectly
Mark Dickinson <dickinsm@gmail.com>
parents: 61807
diff changeset
498 raise TypeError("update() takes at least 1 argument (0 given)")
06b3891a6395 Issue #9137: Fix issue in MutableMapping.update, which incorrectly
Mark Dickinson <dickinsm@gmail.com>
parents: 61807
diff changeset
499 self = args[0]
06b3891a6395 Issue #9137: Fix issue in MutableMapping.update, which incorrectly
Mark Dickinson <dickinsm@gmail.com>
parents: 61807
diff changeset
500 other = args[1] if len(args) >= 2 else ()
06b3891a6395 Issue #9137: Fix issue in MutableMapping.update, which incorrectly
Mark Dickinson <dickinsm@gmail.com>
parents: 61807
diff changeset
501
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
502 if isinstance(other, Mapping):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 for key in other:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
504 self[key] = other[key]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
505 elif hasattr(other, "keys"):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
506 for key in other.keys():
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 self[key] = other[key]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
508 else:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
509 for key, value in other:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
510 self[key] = value
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 for key, value in kwds.items():
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
512 self[key] = value
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
513
45147
1beb7d293f55 Start replacing UserDict.DictMixin with collections.MutableMapping (the bsddb modules are next).
Raymond Hettinger <python@rcn.com>
parents: 45071
diff changeset
514 def setdefault(self, key, default=None):
1beb7d293f55 Start replacing UserDict.DictMixin with collections.MutableMapping (the bsddb modules are next).
Raymond Hettinger <python@rcn.com>
parents: 45071
diff changeset
515 try:
1beb7d293f55 Start replacing UserDict.DictMixin with collections.MutableMapping (the bsddb modules are next).
Raymond Hettinger <python@rcn.com>
parents: 45071
diff changeset
516 return self[key]
1beb7d293f55 Start replacing UserDict.DictMixin with collections.MutableMapping (the bsddb modules are next).
Raymond Hettinger <python@rcn.com>
parents: 45071
diff changeset
517 except KeyError:
1beb7d293f55 Start replacing UserDict.DictMixin with collections.MutableMapping (the bsddb modules are next).
Raymond Hettinger <python@rcn.com>
parents: 45071
diff changeset
518 self[key] = default
1beb7d293f55 Start replacing UserDict.DictMixin with collections.MutableMapping (the bsddb modules are next).
Raymond Hettinger <python@rcn.com>
parents: 45071
diff changeset
519 return default
1beb7d293f55 Start replacing UserDict.DictMixin with collections.MutableMapping (the bsddb modules are next).
Raymond Hettinger <python@rcn.com>
parents: 45071
diff changeset
520
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
521 MutableMapping.register(dict)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
522
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
523
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
524 ### SEQUENCES ###
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
525
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
526
45245
8527ed7563d0 Merge r60679
Raymond Hettinger <python@rcn.com>
parents: 45241
diff changeset
527 class Sequence(Sized, Iterable, Container):
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
528
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
529 """All the operations on a read-only sequence.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
530
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
531 Concrete subclasses must override __new__ or __init__,
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
532 __getitem__, and __len__.
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
533 """
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
534
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
535 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
536 def __getitem__(self, index):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
537 raise IndexError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
538
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
539 def __iter__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
540 i = 0
45241
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
541 try:
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
542 while True:
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
543 v = self[i]
45241
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
544 yield v
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
545 i += 1
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
546 except IndexError:
5950c49f225a Merge r60674 an 60675.
Raymond Hettinger <python@rcn.com>
parents: 45199
diff changeset
547 return
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
548
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
549 def __contains__(self, value):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
550 for v in self:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
551 if v == value:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
552 return True
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
553 return False
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
554
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
555 def __reversed__(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
556 for i in reversed(range(len(self))):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
557 yield self[i]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
558
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
559 def index(self, value):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
560 for i, v in enumerate(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
561 if v == value:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
562 return i
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
563 raise ValueError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
564
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
565 def count(self, value):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
566 return sum(1 for v in self if v == value)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
567
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
568 Sequence.register(tuple)
43577
ace45b361e87 Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents: 43487
diff changeset
569 Sequence.register(str)
51835
bc70ec97e39f Backport r69934 and r69935:
Raymond Hettinger <python@rcn.com>
parents: 51150
diff changeset
570 Sequence.register(range)
43956
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
571
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
572
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
573 class ByteString(Sequence):
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
574
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
575 """This unifies bytes and bytearray.
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
576
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
577 XXX Should add all their methods.
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
578 """
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
579
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
580 ByteString.register(bytes)
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
581 ByteString.register(bytearray)
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
582
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
583
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
584 class MutableSequence(Sequence):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
585
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
586 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
587 def __setitem__(self, index, value):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
588 raise IndexError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
589
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
590 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
591 def __delitem__(self, index):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
592 raise IndexError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
593
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
594 @abstractmethod
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
595 def insert(self, index, value):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
596 raise IndexError
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
597
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
598 def append(self, value):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
599 self.insert(len(self), value)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
600
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 def reverse(self):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
602 n = len(self)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
603 for i in range(n//2):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
604 self[i], self[n-i-1] = self[n-i-1], self[i]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
605
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
606 def extend(self, values):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
607 for v in values:
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
608 self.append(v)
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
609
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
610 def pop(self, index=-1):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
611 v = self[index]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
612 del self[index]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
613 return v
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
614
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
615 def remove(self, value):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
616 del self[self.index(value)]
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
617
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
618 def __iadd__(self, values):
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
619 self.extend(values)
54195
00ebbf1ce936 Issue 6037: MutableSequence.__iadd__ should return self.
Raymond Hettinger <python@rcn.com>
parents: 52665
diff changeset
620 return self
42084
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
621
229c28cb9afb Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
diff changeset
622 MutableSequence.register(list)
43956
fe5b2edffae7 Add ABC ByteString which unifies bytes and bytearray (but not memoryview).
Guido van Rossum <guido@python.org>
parents: 43777
diff changeset
623 MutableSequence.register(bytearray) # Multiply inheriting, see ByteString