ยปCore Development>Code coverage>Lib/_abcoll.py

Python code coverage for Lib/_abcoll.py

#countcontent
1n/a# Copyright 2007 Google, Inc. All Rights Reserved.
2n/a# Licensed to PSF under a Contributor Agreement.
3n/a
4n/a"""Abstract Base Classes (ABCs) for collections, according to PEP 3119.
5n/a
6n/aDON'T USE THIS MODULE DIRECTLY! The classes here should be imported
7n/avia collections; they are defined here only to alleviate certain
8n/abootstrapping issues. Unit tests are in test_collections.
9n/a"""
10n/a
11n/afrom abc import ABCMeta, abstractmethod
12n/aimport sys
13n/a
14n/a__all__ = ["Hashable", "Iterable", "Iterator",
15n/a "Sized", "Container", "Callable",
16n/a "Set", "MutableSet",
17n/a "Mapping", "MutableMapping",
18n/a "MappingView", "KeysView", "ItemsView", "ValuesView",
19n/a "Sequence", "MutableSequence",
20n/a "ByteString",
21n/a ]
22n/a
23n/a
24n/a### collection related types which are not exposed through builtin ###
25n/a## iterators ##
26n/abytes_iterator = type(iter(b''))
27n/abytearray_iterator = type(iter(bytearray()))
28n/a#callable_iterator = ???
29n/adict_keyiterator = type(iter({}.keys()))
30n/adict_valueiterator = type(iter({}.values()))
31n/adict_itemiterator = type(iter({}.items()))
32n/alist_iterator = type(iter([]))
33n/alist_reverseiterator = type(iter(reversed([])))
34n/arange_iterator = type(iter(range(0)))
35n/aset_iterator = type(iter(set()))
36n/astr_iterator = type(iter(""))
37n/atuple_iterator = type(iter(()))
38n/azip_iterator = type(iter(zip()))
39n/a## views ##
40n/adict_keys = type({}.keys())
41n/adict_values = type({}.values())
42n/adict_items = type({}.items())
43n/a## misc ##
44n/adict_proxy = type(type.__dict__)
45n/a
46n/a
47n/a### ONE-TRICK PONIES ###
48n/a
49n/aclass Hashable(metaclass=ABCMeta):
50n/a
51n/a @abstractmethod
52n/a def __hash__(self):
53n/a return 0
54n/a
55n/a @classmethod
56n/a def __subclasshook__(cls, C):
57n/a if cls is Hashable:
58n/a for B in C.__mro__:
59n/a if "__hash__" in B.__dict__:
60n/a if B.__dict__["__hash__"]:
61n/a return True
62n/a break
63n/a return NotImplemented
64n/a
65n/a
66n/aclass Iterable(metaclass=ABCMeta):
67n/a
68n/a @abstractmethod
69n/a def __iter__(self):
70n/a while False:
71n/a yield None
72n/a
73n/a @classmethod
74n/a def __subclasshook__(cls, C):
75n/a if cls is Iterable:
76n/a if any("__iter__" in B.__dict__ for B in C.__mro__):
77n/a return True
78n/a return NotImplemented
79n/a
80n/a
81n/aclass Iterator(Iterable):
82n/a
83n/a @abstractmethod
84n/a def __next__(self):
85n/a raise StopIteration
86n/a
87n/a def __iter__(self):
88n/a return self
89n/a
90n/a @classmethod
91n/a def __subclasshook__(cls, C):
92n/a if cls is Iterator:
93n/a if (any("__next__" in B.__dict__ for B in C.__mro__) and
94n/a any("__iter__" in B.__dict__ for B in C.__mro__)):
95n/a return True
96n/a return NotImplemented
97n/a
98n/aIterator.register(bytes_iterator)
99n/aIterator.register(bytearray_iterator)
100n/a#Iterator.register(callable_iterator)
101n/aIterator.register(dict_keyiterator)
102n/aIterator.register(dict_valueiterator)
103n/aIterator.register(dict_itemiterator)
104n/aIterator.register(list_iterator)
105n/aIterator.register(list_reverseiterator)
106n/aIterator.register(range_iterator)
107n/aIterator.register(set_iterator)
108n/aIterator.register(str_iterator)
109n/aIterator.register(tuple_iterator)
110n/aIterator.register(zip_iterator)
111n/a
112n/aclass Sized(metaclass=ABCMeta):
113n/a
114n/a @abstractmethod
115n/a def __len__(self):
116n/a return 0
117n/a
118n/a @classmethod
119n/a def __subclasshook__(cls, C):
120n/a if cls is Sized:
121n/a if any("__len__" in B.__dict__ for B in C.__mro__):
122n/a return True
123n/a return NotImplemented
124n/a
125n/a
126n/aclass Container(metaclass=ABCMeta):
127n/a
128n/a @abstractmethod
129n/a def __contains__(self, x):
130n/a return False
131n/a
132n/a @classmethod
133n/a def __subclasshook__(cls, C):
134n/a if cls is Container:
135n/a if any("__contains__" in B.__dict__ for B in C.__mro__):
136n/a return True
137n/a return NotImplemented
138n/a
139n/a
140n/aclass Callable(metaclass=ABCMeta):
141n/a
142n/a @abstractmethod
143n/a def __call__(self, *args, **kwds):
144n/a return False
145n/a
146n/a @classmethod
147n/a def __subclasshook__(cls, C):
148n/a if cls is Callable:
149n/a if any("__call__" in B.__dict__ for B in C.__mro__):
150n/a return True
151n/a return NotImplemented
152n/a
153n/a
154n/a### SETS ###
155n/a
156n/a
157n/aclass Set(Sized, Iterable, Container):
158n/a
159n/a """A set is a finite, iterable container.
160n/a
161n/a This class provides concrete generic implementations of all
162n/a methods except for __contains__, __iter__ and __len__.
163n/a
164n/a To override the comparisons (presumably for speed, as the
165n/a semantics are fixed), all you have to do is redefine __le__ and
166n/a then the other operations will automatically follow suit.
167n/a """
168n/a
169n/a def __le__(self, other):
170n/a if not isinstance(other, Set):
171n/a return NotImplemented
172n/a if len(self) > len(other):
173n/a return False
174n/a for elem in self:
175n/a if elem not in other:
176n/a return False
177n/a return True
178n/a
179n/a def __lt__(self, other):
180n/a if not isinstance(other, Set):
181n/a return NotImplemented
182n/a return len(self) < len(other) and self.__le__(other)
183n/a
184n/a def __gt__(self, other):
185n/a if not isinstance(other, Set):
186n/a return NotImplemented
187n/a return other < self
188n/a
189n/a def __ge__(self, other):
190n/a if not isinstance(other, Set):
191n/a return NotImplemented
192n/a return other <= self
193n/a
194n/a def __eq__(self, other):
195n/a if not isinstance(other, Set):
196n/a return NotImplemented
197n/a return len(self) == len(other) and self.__le__(other)
198n/a
199n/a def __ne__(self, other):
200n/a return not (self == other)
201n/a
202n/a @classmethod
203n/a def _from_iterable(cls, it):
204n/a '''Construct an instance of the class from any iterable input.
205n/a
206n/a Must override this method if the class constructor signature
207n/a does not accept an iterable for an input.
208n/a '''
209n/a return cls(it)
210n/a
211n/a def __and__(self, other):
212n/a if not isinstance(other, Iterable):
213n/a return NotImplemented
214n/a return self._from_iterable(value for value in other if value in self)
215n/a
216n/a def isdisjoint(self, other):
217n/a for value in other:
218n/a if value in self:
219n/a return False
220n/a return True
221n/a
222n/a def __or__(self, other):
223n/a if not isinstance(other, Iterable):
224n/a return NotImplemented
225n/a chain = (e for s in (self, other) for e in s)
226n/a return self._from_iterable(chain)
227n/a
228n/a def __sub__(self, other):
229n/a if not isinstance(other, Set):
230n/a if not isinstance(other, Iterable):
231n/a return NotImplemented
232n/a other = self._from_iterable(other)
233n/a return self._from_iterable(value for value in self
234n/a if value not in other)
235n/a
236n/a def __xor__(self, other):
237n/a if not isinstance(other, Set):
238n/a if not isinstance(other, Iterable):
239n/a return NotImplemented
240n/a other = self._from_iterable(other)
241n/a return (self - other) | (other - self)
242n/a
243n/a def _hash(self):
244n/a """Compute the hash value of a set.
245n/a
246n/a Note that we don't define __hash__: not all sets are hashable.
247n/a But if you define a hashable set type, its __hash__ should
248n/a call this function.
249n/a
250n/a This must be compatible __eq__.
251n/a
252n/a All sets ought to compare equal if they contain the same
253n/a elements, regardless of how they are implemented, and
254n/a regardless of the order of the elements; so there's not much
255n/a freedom for __eq__ or __hash__. We match the algorithm used
256n/a by the built-in frozenset type.
257n/a """
258n/a MAX = sys.maxsize
259n/a MASK = 2 * MAX + 1
260n/a n = len(self)
261n/a h = 1927868237 * (n + 1)
262n/a h &= MASK
263n/a for x in self:
264n/a hx = hash(x)
265n/a h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
266n/a h &= MASK
267n/a h = h * 69069 + 907133923
268n/a h &= MASK
269n/a if h > MAX:
270n/a h -= MASK + 1
271n/a if h == -1:
272n/a h = 590923713
273n/a return h
274n/a
275n/aSet.register(frozenset)
276n/a
277n/a
278n/aclass MutableSet(Set):
279n/a
280n/a @abstractmethod
281n/a def add(self, value):
282n/a """Add an element."""
283n/a raise NotImplementedError
284n/a
285n/a @abstractmethod
286n/a def discard(self, value):
287n/a """Remove an element. Do not raise an exception if absent."""
288n/a raise NotImplementedError
289n/a
290n/a def remove(self, value):
291n/a """Remove an element. If not a member, raise a KeyError."""
292n/a if value not in self:
293n/a raise KeyError(value)
294n/a self.discard(value)
295n/a
296n/a def pop(self):
297n/a """Return the popped value. Raise KeyError if empty."""
298n/a it = iter(self)
299n/a try:
300n/a value = next(it)
301n/a except StopIteration:
302n/a raise KeyError
303n/a self.discard(value)
304n/a return value
305n/a
306n/a def clear(self):
307n/a """This is slow (creates N new iterators!) but effective."""
308n/a try:
309n/a while True:
310n/a self.pop()
311n/a except KeyError:
312n/a pass
313n/a
314n/a def __ior__(self, it):
315n/a for value in it:
316n/a self.add(value)
317n/a return self
318n/a
319n/a def __iand__(self, it):
320n/a for value in (self - it):
321n/a self.discard(value)
322n/a return self
323n/a
324n/a def __ixor__(self, it):
325n/a if it is self:
326n/a self.clear()
327n/a else:
328n/a if not isinstance(it, Set):
329n/a it = self._from_iterable(it)
330n/a for value in it:
331n/a if value in self:
332n/a self.discard(value)
333n/a else:
334n/a self.add(value)
335n/a return self
336n/a
337n/a def __isub__(self, it):
338n/a if it is self:
339n/a self.clear()
340n/a else:
341n/a for value in it:
342n/a self.discard(value)
343n/a return self
344n/a
345n/aMutableSet.register(set)
346n/a
347n/a
348n/a### MAPPINGS ###
349n/a
350n/a
351n/aclass Mapping(Sized, Iterable, Container):
352n/a
353n/a @abstractmethod
354n/a def __getitem__(self, key):
355n/a raise KeyError
356n/a
357n/a def get(self, key, default=None):
358n/a try:
359n/a return self[key]
360n/a except KeyError:
361n/a return default
362n/a
363n/a def __contains__(self, key):
364n/a try:
365n/a self[key]
366n/a except KeyError:
367n/a return False
368n/a else:
369n/a return True
370n/a
371n/a def keys(self):
372n/a return KeysView(self)
373n/a
374n/a def items(self):
375n/a return ItemsView(self)
376n/a
377n/a def values(self):
378n/a return ValuesView(self)
379n/a
380n/a def __eq__(self, other):
381n/a if not isinstance(other, Mapping):
382n/a return NotImplemented
383n/a return dict(self.items()) == dict(other.items())
384n/a
385n/a def __ne__(self, other):
386n/a return not (self == other)
387n/a
388n/a
389n/aclass MappingView(Sized):
390n/a
391n/a def __init__(self, mapping):
392n/a self._mapping = mapping
393n/a
394n/a def __len__(self):
395n/a return len(self._mapping)
396n/a
397n/a def __repr__(self):
398n/a return '{0.__class__.__name__}({0._mapping!r})'.format(self)
399n/a
400n/a
401n/aclass KeysView(MappingView, Set):
402n/a
403n/a @classmethod
404n/a def _from_iterable(self, it):
405n/a return set(it)
406n/a
407n/a def __contains__(self, key):
408n/a return key in self._mapping
409n/a
410n/a def __iter__(self):
411n/a for key in self._mapping:
412n/a yield key
413n/a
414n/aKeysView.register(dict_keys)
415n/a
416n/a
417n/aclass ItemsView(MappingView, Set):
418n/a
419n/a @classmethod
420n/a def _from_iterable(self, it):
421n/a return set(it)
422n/a
423n/a def __contains__(self, item):
424n/a key, value = item
425n/a try:
426n/a v = self._mapping[key]
427n/a except KeyError:
428n/a return False
429n/a else:
430n/a return v == value
431n/a
432n/a def __iter__(self):
433n/a for key in self._mapping:
434n/a yield (key, self._mapping[key])
435n/a
436n/aItemsView.register(dict_items)
437n/a
438n/a
439n/aclass ValuesView(MappingView):
440n/a
441n/a def __contains__(self, value):
442n/a for key in self._mapping:
443n/a if value == self._mapping[key]:
444n/a return True
445n/a return False
446n/a
447n/a def __iter__(self):
448n/a for key in self._mapping:
449n/a yield self._mapping[key]
450n/a
451n/aValuesView.register(dict_values)
452n/a
453n/a
454n/aclass MutableMapping(Mapping):
455n/a
456n/a @abstractmethod
457n/a def __setitem__(self, key, value):
458n/a raise KeyError
459n/a
460n/a @abstractmethod
461n/a def __delitem__(self, key):
462n/a raise KeyError
463n/a
464n/a __marker = object()
465n/a
466n/a def pop(self, key, default=__marker):
467n/a try:
468n/a value = self[key]
469n/a except KeyError:
470n/a if default is self.__marker:
471n/a raise
472n/a return default
473n/a else:
474n/a del self[key]
475n/a return value
476n/a
477n/a def popitem(self):
478n/a try:
479n/a key = next(iter(self))
480n/a except StopIteration:
481n/a raise KeyError
482n/a value = self[key]
483n/a del self[key]
484n/a return key, value
485n/a
486n/a def clear(self):
487n/a try:
488n/a while True:
489n/a self.popitem()
490n/a except KeyError:
491n/a pass
492n/a
493n/a def update(*args, **kwds):
494n/a if len(args) > 2:
495n/a raise TypeError("update() takes at most 2 positional "
496n/a "arguments ({} given)".format(len(args)))
497n/a elif not args:
498n/a raise TypeError("update() takes at least 1 argument (0 given)")
499n/a self = args[0]
500n/a other = args[1] if len(args) >= 2 else ()
501n/a
502n/a if isinstance(other, Mapping):
503n/a for key in other:
504n/a self[key] = other[key]
505n/a elif hasattr(other, "keys"):
506n/a for key in other.keys():
507n/a self[key] = other[key]
508n/a else:
509n/a for key, value in other:
510n/a self[key] = value
511n/a for key, value in kwds.items():
512n/a self[key] = value
513n/a
514n/a def setdefault(self, key, default=None):
515n/a try:
516n/a return self[key]
517n/a except KeyError:
518n/a self[key] = default
519n/a return default
520n/a
521n/aMutableMapping.register(dict)
522n/a
523n/a
524n/a### SEQUENCES ###
525n/a
526n/a
527n/aclass Sequence(Sized, Iterable, Container):
528n/a
529n/a """All the operations on a read-only sequence.
530n/a
531n/a Concrete subclasses must override __new__ or __init__,
532n/a __getitem__, and __len__.
533n/a """
534n/a
535n/a @abstractmethod
536n/a def __getitem__(self, index):
537n/a raise IndexError
538n/a
539n/a def __iter__(self):
540n/a i = 0
541n/a try:
542n/a while True:
543n/a v = self[i]
544n/a yield v
545n/a i += 1
546n/a except IndexError:
547n/a return
548n/a
549n/a def __contains__(self, value):
550n/a for v in self:
551n/a if v == value:
552n/a return True
553n/a return False
554n/a
555n/a def __reversed__(self):
556n/a for i in reversed(range(len(self))):
557n/a yield self[i]
558n/a
559n/a def index(self, value):
560n/a for i, v in enumerate(self):
561n/a if v == value:
562n/a return i
563n/a raise ValueError
564n/a
565n/a def count(self, value):
566n/a return sum(1 for v in self if v == value)
567n/a
568n/aSequence.register(tuple)
569n/aSequence.register(str)
570n/aSequence.register(range)
571n/a
572n/a
573n/aclass ByteString(Sequence):
574n/a
575n/a """This unifies bytes and bytearray.
576n/a
577n/a XXX Should add all their methods.
578n/a """
579n/a
580n/aByteString.register(bytes)
581n/aByteString.register(bytearray)
582n/a
583n/a
584n/aclass MutableSequence(Sequence):
585n/a
586n/a @abstractmethod
587n/a def __setitem__(self, index, value):
588n/a raise IndexError
589n/a
590n/a @abstractmethod
591n/a def __delitem__(self, index):
592n/a raise IndexError
593n/a
594n/a @abstractmethod
595n/a def insert(self, index, value):
596n/a raise IndexError
597n/a
598n/a def append(self, value):
599n/a self.insert(len(self), value)
600n/a
601n/a def reverse(self):
602n/a n = len(self)
603n/a for i in range(n//2):
604n/a self[i], self[n-i-1] = self[n-i-1], self[i]
605n/a
606n/a def extend(self, values):
607n/a for v in values:
608n/a self.append(v)
609n/a
610n/a def pop(self, index=-1):
611n/a v = self[index]
612n/a del self[index]
613n/a return v
614n/a
615n/a def remove(self, value):
616n/a del self[self.index(value)]
617n/a
618n/a def __iadd__(self, values):
619n/a self.extend(values)
620n/a return self
621n/a
622n/aMutableSequence.register(list)
623n/aMutableSequence.register(bytearray) # Multiply inheriting, see ByteString