17db96d56Sopenharmony_ci:mod:`collections` --- Container datatypes
27db96d56Sopenharmony_ci==========================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: collections
57db96d56Sopenharmony_ci    :synopsis: Container datatypes
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. moduleauthor:: Raymond Hettinger <python@rcn.com>
87db96d56Sopenharmony_ci.. sectionauthor:: Raymond Hettinger <python@rcn.com>
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci**Source code:** :source:`Lib/collections/__init__.py`
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci.. testsetup:: *
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci    from collections import *
157db96d56Sopenharmony_ci    import itertools
167db96d56Sopenharmony_ci    __name__ = '<doctest>'
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci--------------
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ciThis module implements specialized container datatypes providing alternatives to
217db96d56Sopenharmony_ciPython's general purpose built-in containers, :class:`dict`, :class:`list`,
227db96d56Sopenharmony_ci:class:`set`, and :class:`tuple`.
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci=====================   ====================================================================
257db96d56Sopenharmony_ci:func:`namedtuple`      factory function for creating tuple subclasses with named fields
267db96d56Sopenharmony_ci:class:`deque`          list-like container with fast appends and pops on either end
277db96d56Sopenharmony_ci:class:`ChainMap`       dict-like class for creating a single view of multiple mappings
287db96d56Sopenharmony_ci:class:`Counter`        dict subclass for counting :term:`hashable` objects
297db96d56Sopenharmony_ci:class:`OrderedDict`    dict subclass that remembers the order entries were added
307db96d56Sopenharmony_ci:class:`defaultdict`    dict subclass that calls a factory function to supply missing values
317db96d56Sopenharmony_ci:class:`UserDict`       wrapper around dictionary objects for easier dict subclassing
327db96d56Sopenharmony_ci:class:`UserList`       wrapper around list objects for easier list subclassing
337db96d56Sopenharmony_ci:class:`UserString`     wrapper around string objects for easier string subclassing
347db96d56Sopenharmony_ci=====================   ====================================================================
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci:class:`ChainMap` objects
387db96d56Sopenharmony_ci-------------------------
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci.. versionadded:: 3.3
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ciA :class:`ChainMap` class is provided for quickly linking a number of mappings
437db96d56Sopenharmony_ciso they can be treated as a single unit.  It is often much faster than creating
447db96d56Sopenharmony_cia new dictionary and running multiple :meth:`~dict.update` calls.
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ciThe class can be used to simulate nested scopes and is useful in templating.
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci.. class:: ChainMap(*maps)
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci    A :class:`ChainMap` groups multiple dicts or other mappings together to
517db96d56Sopenharmony_ci    create a single, updateable view.  If no *maps* are specified, a single empty
527db96d56Sopenharmony_ci    dictionary is provided so that a new chain always has at least one mapping.
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci    The underlying mappings are stored in a list.  That list is public and can
557db96d56Sopenharmony_ci    be accessed or updated using the *maps* attribute.  There is no other state.
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci    Lookups search the underlying mappings successively until a key is found.  In
587db96d56Sopenharmony_ci    contrast, writes, updates, and deletions only operate on the first mapping.
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci    A :class:`ChainMap` incorporates the underlying mappings by reference.  So, if
617db96d56Sopenharmony_ci    one of the underlying mappings gets updated, those changes will be reflected
627db96d56Sopenharmony_ci    in :class:`ChainMap`.
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci    All of the usual dictionary methods are supported.  In addition, there is a
657db96d56Sopenharmony_ci    *maps* attribute, a method for creating new subcontexts, and a property for
667db96d56Sopenharmony_ci    accessing all but the first mapping:
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci    .. attribute:: maps
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci        A user updateable list of mappings.  The list is ordered from
717db96d56Sopenharmony_ci        first-searched to last-searched.  It is the only stored state and can
727db96d56Sopenharmony_ci        be modified to change which mappings are searched.  The list should
737db96d56Sopenharmony_ci        always contain at least one mapping.
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci    .. method:: new_child(m=None, **kwargs)
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci        Returns a new :class:`ChainMap` containing a new map followed by
787db96d56Sopenharmony_ci        all of the maps in the current instance.  If ``m`` is specified,
797db96d56Sopenharmony_ci        it becomes the new map at the front of the list of mappings; if not
807db96d56Sopenharmony_ci        specified, an empty dict is used, so that a call to ``d.new_child()``
817db96d56Sopenharmony_ci        is equivalent to: ``ChainMap({}, *d.maps)``. If any keyword arguments
827db96d56Sopenharmony_ci        are specified, they update passed map or new empty dict. This method
837db96d56Sopenharmony_ci        is used for creating subcontexts that can be updated without altering
847db96d56Sopenharmony_ci        values in any of the parent mappings.
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci        .. versionchanged:: 3.4
877db96d56Sopenharmony_ci           The optional ``m`` parameter was added.
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci        .. versionchanged:: 3.10
907db96d56Sopenharmony_ci           Keyword arguments support was added.
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci    .. attribute:: parents
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci        Property returning a new :class:`ChainMap` containing all of the maps in
957db96d56Sopenharmony_ci        the current instance except the first one.  This is useful for skipping
967db96d56Sopenharmony_ci        the first map in the search.  Use cases are similar to those for the
977db96d56Sopenharmony_ci        :keyword:`nonlocal` keyword used in :term:`nested scopes <nested
987db96d56Sopenharmony_ci        scope>`.  The use cases also parallel those for the built-in
997db96d56Sopenharmony_ci        :func:`super` function.  A reference to ``d.parents`` is equivalent to:
1007db96d56Sopenharmony_ci        ``ChainMap(*d.maps[1:])``.
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci    Note, the iteration order of a :class:`ChainMap()` is determined by
1037db96d56Sopenharmony_ci    scanning the mappings last to first::
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci        >>> baseline = {'music': 'bach', 'art': 'rembrandt'}
1067db96d56Sopenharmony_ci        >>> adjustments = {'art': 'van gogh', 'opera': 'carmen'}
1077db96d56Sopenharmony_ci        >>> list(ChainMap(adjustments, baseline))
1087db96d56Sopenharmony_ci        ['music', 'art', 'opera']
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci    This gives the same ordering as a series of :meth:`dict.update` calls
1117db96d56Sopenharmony_ci    starting with the last mapping::
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci        >>> combined = baseline.copy()
1147db96d56Sopenharmony_ci        >>> combined.update(adjustments)
1157db96d56Sopenharmony_ci        >>> list(combined)
1167db96d56Sopenharmony_ci        ['music', 'art', 'opera']
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci    .. versionchanged:: 3.9
1197db96d56Sopenharmony_ci       Added support for ``|`` and ``|=`` operators, specified in :pep:`584`.
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci.. seealso::
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci    * The `MultiContext class
1247db96d56Sopenharmony_ci      <https://github.com/enthought/codetools/blob/4.0.0/codetools/contexts/multi_context.py>`_
1257db96d56Sopenharmony_ci      in the Enthought `CodeTools package
1267db96d56Sopenharmony_ci      <https://github.com/enthought/codetools>`_ has options to support
1277db96d56Sopenharmony_ci      writing to any mapping in the chain.
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci    * Django's `Context class
1307db96d56Sopenharmony_ci      <https://github.com/django/django/blob/main/django/template/context.py>`_
1317db96d56Sopenharmony_ci      for templating is a read-only chain of mappings.  It also features
1327db96d56Sopenharmony_ci      pushing and popping of contexts similar to the
1337db96d56Sopenharmony_ci      :meth:`~collections.ChainMap.new_child` method and the
1347db96d56Sopenharmony_ci      :attr:`~collections.ChainMap.parents` property.
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci    * The `Nested Contexts recipe
1377db96d56Sopenharmony_ci      <https://code.activestate.com/recipes/577434/>`_ has options to control
1387db96d56Sopenharmony_ci      whether writes and other mutations apply only to the first mapping or to
1397db96d56Sopenharmony_ci      any mapping in the chain.
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci    * A `greatly simplified read-only version of Chainmap
1427db96d56Sopenharmony_ci      <https://code.activestate.com/recipes/305268/>`_.
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci:class:`ChainMap` Examples and Recipes
1467db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ciThis section shows various approaches to working with chained maps.
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ciExample of simulating Python's internal lookup chain::
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci        import builtins
1547db96d56Sopenharmony_ci        pylookup = ChainMap(locals(), globals(), vars(builtins))
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ciExample of letting user specified command-line arguments take precedence over
1577db96d56Sopenharmony_cienvironment variables which in turn take precedence over default values::
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci        import os, argparse
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci        defaults = {'color': 'red', 'user': 'guest'}
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci        parser = argparse.ArgumentParser()
1647db96d56Sopenharmony_ci        parser.add_argument('-u', '--user')
1657db96d56Sopenharmony_ci        parser.add_argument('-c', '--color')
1667db96d56Sopenharmony_ci        namespace = parser.parse_args()
1677db96d56Sopenharmony_ci        command_line_args = {k: v for k, v in vars(namespace).items() if v is not None}
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci        combined = ChainMap(command_line_args, os.environ, defaults)
1707db96d56Sopenharmony_ci        print(combined['color'])
1717db96d56Sopenharmony_ci        print(combined['user'])
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ciExample patterns for using the :class:`ChainMap` class to simulate nested
1747db96d56Sopenharmony_cicontexts::
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci        c = ChainMap()        # Create root context
1777db96d56Sopenharmony_ci        d = c.new_child()     # Create nested child context
1787db96d56Sopenharmony_ci        e = c.new_child()     # Child of c, independent from d
1797db96d56Sopenharmony_ci        e.maps[0]             # Current context dictionary -- like Python's locals()
1807db96d56Sopenharmony_ci        e.maps[-1]            # Root context -- like Python's globals()
1817db96d56Sopenharmony_ci        e.parents             # Enclosing context chain -- like Python's nonlocals
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci        d['x'] = 1            # Set value in current context
1847db96d56Sopenharmony_ci        d['x']                # Get first key in the chain of contexts
1857db96d56Sopenharmony_ci        del d['x']            # Delete from current context
1867db96d56Sopenharmony_ci        list(d)               # All nested values
1877db96d56Sopenharmony_ci        k in d                # Check all nested values
1887db96d56Sopenharmony_ci        len(d)                # Number of nested values
1897db96d56Sopenharmony_ci        d.items()             # All nested items
1907db96d56Sopenharmony_ci        dict(d)               # Flatten into a regular dictionary
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ciThe :class:`ChainMap` class only makes updates (writes and deletions) to the
1937db96d56Sopenharmony_cifirst mapping in the chain while lookups will search the full chain.  However,
1947db96d56Sopenharmony_ciif deep writes and deletions are desired, it is easy to make a subclass that
1957db96d56Sopenharmony_ciupdates keys found deeper in the chain::
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci    class DeepChainMap(ChainMap):
1987db96d56Sopenharmony_ci        'Variant of ChainMap that allows direct updates to inner scopes'
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci        def __setitem__(self, key, value):
2017db96d56Sopenharmony_ci            for mapping in self.maps:
2027db96d56Sopenharmony_ci                if key in mapping:
2037db96d56Sopenharmony_ci                    mapping[key] = value
2047db96d56Sopenharmony_ci                    return
2057db96d56Sopenharmony_ci            self.maps[0][key] = value
2067db96d56Sopenharmony_ci
2077db96d56Sopenharmony_ci        def __delitem__(self, key):
2087db96d56Sopenharmony_ci            for mapping in self.maps:
2097db96d56Sopenharmony_ci                if key in mapping:
2107db96d56Sopenharmony_ci                    del mapping[key]
2117db96d56Sopenharmony_ci                    return
2127db96d56Sopenharmony_ci            raise KeyError(key)
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci    >>> d = DeepChainMap({'zebra': 'black'}, {'elephant': 'blue'}, {'lion': 'yellow'})
2157db96d56Sopenharmony_ci    >>> d['lion'] = 'orange'         # update an existing key two levels down
2167db96d56Sopenharmony_ci    >>> d['snake'] = 'red'           # new keys get added to the topmost dict
2177db96d56Sopenharmony_ci    >>> del d['elephant']            # remove an existing key one level down
2187db96d56Sopenharmony_ci    >>> d                            # display result
2197db96d56Sopenharmony_ci    DeepChainMap({'zebra': 'black', 'snake': 'red'}, {}, {'lion': 'orange'})
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci:class:`Counter` objects
2237db96d56Sopenharmony_ci------------------------
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ciA counter tool is provided to support convenient and rapid tallies.
2267db96d56Sopenharmony_ciFor example::
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci    >>> # Tally occurrences of words in a list
2297db96d56Sopenharmony_ci    >>> cnt = Counter()
2307db96d56Sopenharmony_ci    >>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
2317db96d56Sopenharmony_ci    ...     cnt[word] += 1
2327db96d56Sopenharmony_ci    >>> cnt
2337db96d56Sopenharmony_ci    Counter({'blue': 3, 'red': 2, 'green': 1})
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci    >>> # Find the ten most common words in Hamlet
2367db96d56Sopenharmony_ci    >>> import re
2377db96d56Sopenharmony_ci    >>> words = re.findall(r'\w+', open('hamlet.txt').read().lower())
2387db96d56Sopenharmony_ci    >>> Counter(words).most_common(10)
2397db96d56Sopenharmony_ci    [('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
2407db96d56Sopenharmony_ci     ('you', 554),  ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci.. class:: Counter([iterable-or-mapping])
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci    A :class:`Counter` is a :class:`dict` subclass for counting :term:`hashable` objects.
2457db96d56Sopenharmony_ci    It is a collection where elements are stored as dictionary keys
2467db96d56Sopenharmony_ci    and their counts are stored as dictionary values.  Counts are allowed to be
2477db96d56Sopenharmony_ci    any integer value including zero or negative counts.  The :class:`Counter`
2487db96d56Sopenharmony_ci    class is similar to bags or multisets in other languages.
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci    Elements are counted from an *iterable* or initialized from another
2517db96d56Sopenharmony_ci    *mapping* (or counter):
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci        >>> c = Counter()                           # a new, empty counter
2547db96d56Sopenharmony_ci        >>> c = Counter('gallahad')                 # a new counter from an iterable
2557db96d56Sopenharmony_ci        >>> c = Counter({'red': 4, 'blue': 2})      # a new counter from a mapping
2567db96d56Sopenharmony_ci        >>> c = Counter(cats=4, dogs=8)             # a new counter from keyword args
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci    Counter objects have a dictionary interface except that they return a zero
2597db96d56Sopenharmony_ci    count for missing items instead of raising a :exc:`KeyError`:
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci        >>> c = Counter(['eggs', 'ham'])
2627db96d56Sopenharmony_ci        >>> c['bacon']                              # count of a missing element is zero
2637db96d56Sopenharmony_ci        0
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci    Setting a count to zero does not remove an element from a counter.
2667db96d56Sopenharmony_ci    Use ``del`` to remove it entirely:
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci        >>> c['sausage'] = 0                        # counter entry with a zero count
2697db96d56Sopenharmony_ci        >>> del c['sausage']                        # del actually removes the entry
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci    .. versionadded:: 3.1
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci    .. versionchanged:: 3.7 As a :class:`dict` subclass, :class:`Counter`
2747db96d56Sopenharmony_ci       inherited the capability to remember insertion order.  Math operations
2757db96d56Sopenharmony_ci       on *Counter* objects also preserve order.  Results are ordered
2767db96d56Sopenharmony_ci       according to when an element is first encountered in the left operand
2777db96d56Sopenharmony_ci       and then by the order encountered in the right operand.
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci    Counter objects support additional methods beyond those available for all
2807db96d56Sopenharmony_ci    dictionaries:
2817db96d56Sopenharmony_ci
2827db96d56Sopenharmony_ci    .. method:: elements()
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci        Return an iterator over elements repeating each as many times as its
2857db96d56Sopenharmony_ci        count.  Elements are returned in the order first encountered. If an
2867db96d56Sopenharmony_ci        element's count is less than one, :meth:`elements` will ignore it.
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci            >>> c = Counter(a=4, b=2, c=0, d=-2)
2897db96d56Sopenharmony_ci            >>> sorted(c.elements())
2907db96d56Sopenharmony_ci            ['a', 'a', 'a', 'a', 'b', 'b']
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci    .. method:: most_common([n])
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci        Return a list of the *n* most common elements and their counts from the
2957db96d56Sopenharmony_ci        most common to the least.  If *n* is omitted or ``None``,
2967db96d56Sopenharmony_ci        :meth:`most_common` returns *all* elements in the counter.
2977db96d56Sopenharmony_ci        Elements with equal counts are ordered in the order first encountered:
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci            >>> Counter('abracadabra').most_common(3)
3007db96d56Sopenharmony_ci            [('a', 5), ('b', 2), ('r', 2)]
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci    .. method:: subtract([iterable-or-mapping])
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci        Elements are subtracted from an *iterable* or from another *mapping*
3057db96d56Sopenharmony_ci        (or counter).  Like :meth:`dict.update` but subtracts counts instead
3067db96d56Sopenharmony_ci        of replacing them.  Both inputs and outputs may be zero or negative.
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci            >>> c = Counter(a=4, b=2, c=0, d=-2)
3097db96d56Sopenharmony_ci            >>> d = Counter(a=1, b=2, c=3, d=4)
3107db96d56Sopenharmony_ci            >>> c.subtract(d)
3117db96d56Sopenharmony_ci            >>> c
3127db96d56Sopenharmony_ci            Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci        .. versionadded:: 3.2
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci    .. method:: total()
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ci        Compute the sum of the counts.
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_ci            >>> c = Counter(a=10, b=5, c=0)
3217db96d56Sopenharmony_ci            >>> c.total()
3227db96d56Sopenharmony_ci            15
3237db96d56Sopenharmony_ci
3247db96d56Sopenharmony_ci        .. versionadded:: 3.10
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci    The usual dictionary methods are available for :class:`Counter` objects
3277db96d56Sopenharmony_ci    except for two which work differently for counters.
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci    .. method:: fromkeys(iterable)
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci        This class method is not implemented for :class:`Counter` objects.
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ci    .. method:: update([iterable-or-mapping])
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci        Elements are counted from an *iterable* or added-in from another
3367db96d56Sopenharmony_ci        *mapping* (or counter).  Like :meth:`dict.update` but adds counts
3377db96d56Sopenharmony_ci        instead of replacing them.  Also, the *iterable* is expected to be a
3387db96d56Sopenharmony_ci        sequence of elements, not a sequence of ``(key, value)`` pairs.
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ciCounters support rich comparison operators for equality, subset, and
3417db96d56Sopenharmony_cisuperset relationships: ``==``, ``!=``, ``<``, ``<=``, ``>``, ``>=``.
3427db96d56Sopenharmony_ciAll of those tests treat missing elements as having zero counts so that
3437db96d56Sopenharmony_ci``Counter(a=1) == Counter(a=1, b=0)`` returns true.
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci.. versionadded:: 3.10
3467db96d56Sopenharmony_ci   Rich comparison operations were added.
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ci.. versionchanged:: 3.10
3497db96d56Sopenharmony_ci   In equality tests, missing elements are treated as having zero counts.
3507db96d56Sopenharmony_ci   Formerly, ``Counter(a=3)`` and ``Counter(a=3, b=0)`` were considered
3517db96d56Sopenharmony_ci   distinct.
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ciCommon patterns for working with :class:`Counter` objects::
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci    c.total()                       # total of all counts
3567db96d56Sopenharmony_ci    c.clear()                       # reset all counts
3577db96d56Sopenharmony_ci    list(c)                         # list unique elements
3587db96d56Sopenharmony_ci    set(c)                          # convert to a set
3597db96d56Sopenharmony_ci    dict(c)                         # convert to a regular dictionary
3607db96d56Sopenharmony_ci    c.items()                       # convert to a list of (elem, cnt) pairs
3617db96d56Sopenharmony_ci    Counter(dict(list_of_pairs))    # convert from a list of (elem, cnt) pairs
3627db96d56Sopenharmony_ci    c.most_common()[:-n-1:-1]       # n least common elements
3637db96d56Sopenharmony_ci    +c                              # remove zero and negative counts
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ciSeveral mathematical operations are provided for combining :class:`Counter`
3667db96d56Sopenharmony_ciobjects to produce multisets (counters that have counts greater than zero).
3677db96d56Sopenharmony_ciAddition and subtraction combine counters by adding or subtracting the counts
3687db96d56Sopenharmony_ciof corresponding elements.  Intersection and union return the minimum and
3697db96d56Sopenharmony_cimaximum of corresponding counts.  Equality and inclusion compare
3707db96d56Sopenharmony_cicorresponding counts.  Each operation can accept inputs with signed
3717db96d56Sopenharmony_cicounts, but the output will exclude results with counts of zero or less.
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci.. doctest::
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci    >>> c = Counter(a=3, b=1)
3767db96d56Sopenharmony_ci    >>> d = Counter(a=1, b=2)
3777db96d56Sopenharmony_ci    >>> c + d                       # add two counters together:  c[x] + d[x]
3787db96d56Sopenharmony_ci    Counter({'a': 4, 'b': 3})
3797db96d56Sopenharmony_ci    >>> c - d                       # subtract (keeping only positive counts)
3807db96d56Sopenharmony_ci    Counter({'a': 2})
3817db96d56Sopenharmony_ci    >>> c & d                       # intersection:  min(c[x], d[x])
3827db96d56Sopenharmony_ci    Counter({'a': 1, 'b': 1})
3837db96d56Sopenharmony_ci    >>> c | d                       # union:  max(c[x], d[x])
3847db96d56Sopenharmony_ci    Counter({'a': 3, 'b': 2})
3857db96d56Sopenharmony_ci    >>> c == d                      # equality:  c[x] == d[x]
3867db96d56Sopenharmony_ci    False
3877db96d56Sopenharmony_ci    >>> c <= d                      # inclusion:  c[x] <= d[x]
3887db96d56Sopenharmony_ci    False
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ciUnary addition and subtraction are shortcuts for adding an empty counter
3917db96d56Sopenharmony_cior subtracting from an empty counter.
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci    >>> c = Counter(a=2, b=-4)
3947db96d56Sopenharmony_ci    >>> +c
3957db96d56Sopenharmony_ci    Counter({'a': 2})
3967db96d56Sopenharmony_ci    >>> -c
3977db96d56Sopenharmony_ci    Counter({'b': 4})
3987db96d56Sopenharmony_ci
3997db96d56Sopenharmony_ci.. versionadded:: 3.3
4007db96d56Sopenharmony_ci    Added support for unary plus, unary minus, and in-place multiset operations.
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci.. note::
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci    Counters were primarily designed to work with positive integers to represent
4057db96d56Sopenharmony_ci    running counts; however, care was taken to not unnecessarily preclude use
4067db96d56Sopenharmony_ci    cases needing other types or negative values.  To help with those use cases,
4077db96d56Sopenharmony_ci    this section documents the minimum range and type restrictions.
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci    * The :class:`Counter` class itself is a dictionary subclass with no
4107db96d56Sopenharmony_ci      restrictions on its keys and values.  The values are intended to be numbers
4117db96d56Sopenharmony_ci      representing counts, but you *could* store anything in the value field.
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci    * The :meth:`~Counter.most_common` method requires only that the values be orderable.
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci    * For in-place operations such as ``c[key] += 1``, the value type need only
4167db96d56Sopenharmony_ci      support addition and subtraction.  So fractions, floats, and decimals would
4177db96d56Sopenharmony_ci      work and negative values are supported.  The same is also true for
4187db96d56Sopenharmony_ci      :meth:`~Counter.update` and :meth:`~Counter.subtract` which allow negative and zero values
4197db96d56Sopenharmony_ci      for both inputs and outputs.
4207db96d56Sopenharmony_ci
4217db96d56Sopenharmony_ci    * The multiset methods are designed only for use cases with positive values.
4227db96d56Sopenharmony_ci      The inputs may be negative or zero, but only outputs with positive values
4237db96d56Sopenharmony_ci      are created.  There are no type restrictions, but the value type needs to
4247db96d56Sopenharmony_ci      support addition, subtraction, and comparison.
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci    * The :meth:`~Counter.elements` method requires integer counts.  It ignores zero and
4277db96d56Sopenharmony_ci      negative counts.
4287db96d56Sopenharmony_ci
4297db96d56Sopenharmony_ci.. seealso::
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_ci    * `Bag class <https://www.gnu.org/software/smalltalk/manual-base/html_node/Bag.html>`_
4327db96d56Sopenharmony_ci      in Smalltalk.
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci    * Wikipedia entry for `Multisets <https://en.wikipedia.org/wiki/Multiset>`_.
4357db96d56Sopenharmony_ci
4367db96d56Sopenharmony_ci    * `C++ multisets <http://www.java2s.com/Tutorial/Cpp/0380__set-multiset/Catalog0380__set-multiset.htm>`_
4377db96d56Sopenharmony_ci      tutorial with examples.
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci    * For mathematical operations on multisets and their use cases, see
4407db96d56Sopenharmony_ci      *Knuth, Donald. The Art of Computer Programming Volume II,
4417db96d56Sopenharmony_ci      Section 4.6.3, Exercise 19*.
4427db96d56Sopenharmony_ci
4437db96d56Sopenharmony_ci    * To enumerate all distinct multisets of a given size over a given set of
4447db96d56Sopenharmony_ci      elements, see :func:`itertools.combinations_with_replacement`::
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci          map(Counter, combinations_with_replacement('ABC', 2)) # --> AA AB AC BB BC CC
4477db96d56Sopenharmony_ci
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci:class:`deque` objects
4507db96d56Sopenharmony_ci----------------------
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ci.. class:: deque([iterable, [maxlen]])
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci    Returns a new deque object initialized left-to-right (using :meth:`append`) with
4557db96d56Sopenharmony_ci    data from *iterable*.  If *iterable* is not specified, the new deque is empty.
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci    Deques are a generalization of stacks and queues (the name is pronounced "deck"
4587db96d56Sopenharmony_ci    and is short for "double-ended queue").  Deques support thread-safe, memory
4597db96d56Sopenharmony_ci    efficient appends and pops from either side of the deque with approximately the
4607db96d56Sopenharmony_ci    same O(1) performance in either direction.
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci    Though :class:`list` objects support similar operations, they are optimized for
4637db96d56Sopenharmony_ci    fast fixed-length operations and incur O(n) memory movement costs for
4647db96d56Sopenharmony_ci    ``pop(0)`` and ``insert(0, v)`` operations which change both the size and
4657db96d56Sopenharmony_ci    position of the underlying data representation.
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci
4687db96d56Sopenharmony_ci    If *maxlen* is not specified or is ``None``, deques may grow to an
4697db96d56Sopenharmony_ci    arbitrary length.  Otherwise, the deque is bounded to the specified maximum
4707db96d56Sopenharmony_ci    length.  Once a bounded length deque is full, when new items are added, a
4717db96d56Sopenharmony_ci    corresponding number of items are discarded from the opposite end.  Bounded
4727db96d56Sopenharmony_ci    length deques provide functionality similar to the ``tail`` filter in
4737db96d56Sopenharmony_ci    Unix. They are also useful for tracking transactions and other pools of data
4747db96d56Sopenharmony_ci    where only the most recent activity is of interest.
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_ci    Deque objects support the following methods:
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ci    .. method:: append(x)
4807db96d56Sopenharmony_ci
4817db96d56Sopenharmony_ci        Add *x* to the right side of the deque.
4827db96d56Sopenharmony_ci
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci    .. method:: appendleft(x)
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci        Add *x* to the left side of the deque.
4877db96d56Sopenharmony_ci
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_ci    .. method:: clear()
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci        Remove all elements from the deque leaving it with length 0.
4927db96d56Sopenharmony_ci
4937db96d56Sopenharmony_ci
4947db96d56Sopenharmony_ci    .. method:: copy()
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci        Create a shallow copy of the deque.
4977db96d56Sopenharmony_ci
4987db96d56Sopenharmony_ci        .. versionadded:: 3.5
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci    .. method:: count(x)
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci        Count the number of deque elements equal to *x*.
5047db96d56Sopenharmony_ci
5057db96d56Sopenharmony_ci        .. versionadded:: 3.2
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ci    .. method:: extend(iterable)
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci        Extend the right side of the deque by appending elements from the iterable
5117db96d56Sopenharmony_ci        argument.
5127db96d56Sopenharmony_ci
5137db96d56Sopenharmony_ci
5147db96d56Sopenharmony_ci    .. method:: extendleft(iterable)
5157db96d56Sopenharmony_ci
5167db96d56Sopenharmony_ci        Extend the left side of the deque by appending elements from *iterable*.
5177db96d56Sopenharmony_ci        Note, the series of left appends results in reversing the order of
5187db96d56Sopenharmony_ci        elements in the iterable argument.
5197db96d56Sopenharmony_ci
5207db96d56Sopenharmony_ci
5217db96d56Sopenharmony_ci    .. method:: index(x[, start[, stop]])
5227db96d56Sopenharmony_ci
5237db96d56Sopenharmony_ci        Return the position of *x* in the deque (at or after index *start*
5247db96d56Sopenharmony_ci        and before index *stop*).  Returns the first match or raises
5257db96d56Sopenharmony_ci        :exc:`ValueError` if not found.
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ci        .. versionadded:: 3.5
5287db96d56Sopenharmony_ci
5297db96d56Sopenharmony_ci
5307db96d56Sopenharmony_ci    .. method:: insert(i, x)
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ci        Insert *x* into the deque at position *i*.
5337db96d56Sopenharmony_ci
5347db96d56Sopenharmony_ci        If the insertion would cause a bounded deque to grow beyond *maxlen*,
5357db96d56Sopenharmony_ci        an :exc:`IndexError` is raised.
5367db96d56Sopenharmony_ci
5377db96d56Sopenharmony_ci        .. versionadded:: 3.5
5387db96d56Sopenharmony_ci
5397db96d56Sopenharmony_ci
5407db96d56Sopenharmony_ci    .. method:: pop()
5417db96d56Sopenharmony_ci
5427db96d56Sopenharmony_ci        Remove and return an element from the right side of the deque. If no
5437db96d56Sopenharmony_ci        elements are present, raises an :exc:`IndexError`.
5447db96d56Sopenharmony_ci
5457db96d56Sopenharmony_ci
5467db96d56Sopenharmony_ci    .. method:: popleft()
5477db96d56Sopenharmony_ci
5487db96d56Sopenharmony_ci        Remove and return an element from the left side of the deque. If no
5497db96d56Sopenharmony_ci        elements are present, raises an :exc:`IndexError`.
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_ci    .. method:: remove(value)
5537db96d56Sopenharmony_ci
5547db96d56Sopenharmony_ci        Remove the first occurrence of *value*.  If not found, raises a
5557db96d56Sopenharmony_ci        :exc:`ValueError`.
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ci
5587db96d56Sopenharmony_ci    .. method:: reverse()
5597db96d56Sopenharmony_ci
5607db96d56Sopenharmony_ci        Reverse the elements of the deque in-place and then return ``None``.
5617db96d56Sopenharmony_ci
5627db96d56Sopenharmony_ci        .. versionadded:: 3.2
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci
5657db96d56Sopenharmony_ci    .. method:: rotate(n=1)
5667db96d56Sopenharmony_ci
5677db96d56Sopenharmony_ci        Rotate the deque *n* steps to the right.  If *n* is negative, rotate
5687db96d56Sopenharmony_ci        to the left.
5697db96d56Sopenharmony_ci
5707db96d56Sopenharmony_ci        When the deque is not empty, rotating one step to the right is equivalent
5717db96d56Sopenharmony_ci        to ``d.appendleft(d.pop())``, and rotating one step to the left is
5727db96d56Sopenharmony_ci        equivalent to ``d.append(d.popleft())``.
5737db96d56Sopenharmony_ci
5747db96d56Sopenharmony_ci
5757db96d56Sopenharmony_ci    Deque objects also provide one read-only attribute:
5767db96d56Sopenharmony_ci
5777db96d56Sopenharmony_ci    .. attribute:: maxlen
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci        Maximum size of a deque or ``None`` if unbounded.
5807db96d56Sopenharmony_ci
5817db96d56Sopenharmony_ci        .. versionadded:: 3.1
5827db96d56Sopenharmony_ci
5837db96d56Sopenharmony_ci
5847db96d56Sopenharmony_ciIn addition to the above, deques support iteration, pickling, ``len(d)``,
5857db96d56Sopenharmony_ci``reversed(d)``, ``copy.copy(d)``, ``copy.deepcopy(d)``, membership testing with
5867db96d56Sopenharmony_cithe :keyword:`in` operator, and subscript references such as ``d[0]`` to access
5877db96d56Sopenharmony_cithe first element.  Indexed access is O(1) at both ends but slows to O(n) in
5887db96d56Sopenharmony_cithe middle.  For fast random access, use lists instead.
5897db96d56Sopenharmony_ci
5907db96d56Sopenharmony_ciStarting in version 3.5, deques support ``__add__()``, ``__mul__()``,
5917db96d56Sopenharmony_ciand ``__imul__()``.
5927db96d56Sopenharmony_ci
5937db96d56Sopenharmony_ciExample:
5947db96d56Sopenharmony_ci
5957db96d56Sopenharmony_ci.. doctest::
5967db96d56Sopenharmony_ci
5977db96d56Sopenharmony_ci    >>> from collections import deque
5987db96d56Sopenharmony_ci    >>> d = deque('ghi')                 # make a new deque with three items
5997db96d56Sopenharmony_ci    >>> for elem in d:                   # iterate over the deque's elements
6007db96d56Sopenharmony_ci    ...     print(elem.upper())
6017db96d56Sopenharmony_ci    G
6027db96d56Sopenharmony_ci    H
6037db96d56Sopenharmony_ci    I
6047db96d56Sopenharmony_ci
6057db96d56Sopenharmony_ci    >>> d.append('j')                    # add a new entry to the right side
6067db96d56Sopenharmony_ci    >>> d.appendleft('f')                # add a new entry to the left side
6077db96d56Sopenharmony_ci    >>> d                                # show the representation of the deque
6087db96d56Sopenharmony_ci    deque(['f', 'g', 'h', 'i', 'j'])
6097db96d56Sopenharmony_ci
6107db96d56Sopenharmony_ci    >>> d.pop()                          # return and remove the rightmost item
6117db96d56Sopenharmony_ci    'j'
6127db96d56Sopenharmony_ci    >>> d.popleft()                      # return and remove the leftmost item
6137db96d56Sopenharmony_ci    'f'
6147db96d56Sopenharmony_ci    >>> list(d)                          # list the contents of the deque
6157db96d56Sopenharmony_ci    ['g', 'h', 'i']
6167db96d56Sopenharmony_ci    >>> d[0]                             # peek at leftmost item
6177db96d56Sopenharmony_ci    'g'
6187db96d56Sopenharmony_ci    >>> d[-1]                            # peek at rightmost item
6197db96d56Sopenharmony_ci    'i'
6207db96d56Sopenharmony_ci
6217db96d56Sopenharmony_ci    >>> list(reversed(d))                # list the contents of a deque in reverse
6227db96d56Sopenharmony_ci    ['i', 'h', 'g']
6237db96d56Sopenharmony_ci    >>> 'h' in d                         # search the deque
6247db96d56Sopenharmony_ci    True
6257db96d56Sopenharmony_ci    >>> d.extend('jkl')                  # add multiple elements at once
6267db96d56Sopenharmony_ci    >>> d
6277db96d56Sopenharmony_ci    deque(['g', 'h', 'i', 'j', 'k', 'l'])
6287db96d56Sopenharmony_ci    >>> d.rotate(1)                      # right rotation
6297db96d56Sopenharmony_ci    >>> d
6307db96d56Sopenharmony_ci    deque(['l', 'g', 'h', 'i', 'j', 'k'])
6317db96d56Sopenharmony_ci    >>> d.rotate(-1)                     # left rotation
6327db96d56Sopenharmony_ci    >>> d
6337db96d56Sopenharmony_ci    deque(['g', 'h', 'i', 'j', 'k', 'l'])
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci    >>> deque(reversed(d))               # make a new deque in reverse order
6367db96d56Sopenharmony_ci    deque(['l', 'k', 'j', 'i', 'h', 'g'])
6377db96d56Sopenharmony_ci    >>> d.clear()                        # empty the deque
6387db96d56Sopenharmony_ci    >>> d.pop()                          # cannot pop from an empty deque
6397db96d56Sopenharmony_ci    Traceback (most recent call last):
6407db96d56Sopenharmony_ci        File "<pyshell#6>", line 1, in -toplevel-
6417db96d56Sopenharmony_ci            d.pop()
6427db96d56Sopenharmony_ci    IndexError: pop from an empty deque
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ci    >>> d.extendleft('abc')              # extendleft() reverses the input order
6457db96d56Sopenharmony_ci    >>> d
6467db96d56Sopenharmony_ci    deque(['c', 'b', 'a'])
6477db96d56Sopenharmony_ci
6487db96d56Sopenharmony_ci
6497db96d56Sopenharmony_ci:class:`deque` Recipes
6507db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^
6517db96d56Sopenharmony_ci
6527db96d56Sopenharmony_ciThis section shows various approaches to working with deques.
6537db96d56Sopenharmony_ci
6547db96d56Sopenharmony_ciBounded length deques provide functionality similar to the ``tail`` filter
6557db96d56Sopenharmony_ciin Unix::
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ci    def tail(filename, n=10):
6587db96d56Sopenharmony_ci        'Return the last n lines of a file'
6597db96d56Sopenharmony_ci        with open(filename) as f:
6607db96d56Sopenharmony_ci            return deque(f, n)
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ciAnother approach to using deques is to maintain a sequence of recently
6637db96d56Sopenharmony_ciadded elements by appending to the right and popping to the left::
6647db96d56Sopenharmony_ci
6657db96d56Sopenharmony_ci    def moving_average(iterable, n=3):
6667db96d56Sopenharmony_ci        # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0
6677db96d56Sopenharmony_ci        # https://en.wikipedia.org/wiki/Moving_average
6687db96d56Sopenharmony_ci        it = iter(iterable)
6697db96d56Sopenharmony_ci        d = deque(itertools.islice(it, n-1))
6707db96d56Sopenharmony_ci        d.appendleft(0)
6717db96d56Sopenharmony_ci        s = sum(d)
6727db96d56Sopenharmony_ci        for elem in it:
6737db96d56Sopenharmony_ci            s += elem - d.popleft()
6747db96d56Sopenharmony_ci            d.append(elem)
6757db96d56Sopenharmony_ci            yield s / n
6767db96d56Sopenharmony_ci
6777db96d56Sopenharmony_ciA `round-robin scheduler
6787db96d56Sopenharmony_ci<https://en.wikipedia.org/wiki/Round-robin_scheduling>`_ can be implemented with
6797db96d56Sopenharmony_ciinput iterators stored in a :class:`deque`.  Values are yielded from the active
6807db96d56Sopenharmony_ciiterator in position zero.  If that iterator is exhausted, it can be removed
6817db96d56Sopenharmony_ciwith :meth:`~deque.popleft`; otherwise, it can be cycled back to the end with
6827db96d56Sopenharmony_cithe :meth:`~deque.rotate` method::
6837db96d56Sopenharmony_ci
6847db96d56Sopenharmony_ci    def roundrobin(*iterables):
6857db96d56Sopenharmony_ci        "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
6867db96d56Sopenharmony_ci        iterators = deque(map(iter, iterables))
6877db96d56Sopenharmony_ci        while iterators:
6887db96d56Sopenharmony_ci            try:
6897db96d56Sopenharmony_ci                while True:
6907db96d56Sopenharmony_ci                    yield next(iterators[0])
6917db96d56Sopenharmony_ci                    iterators.rotate(-1)
6927db96d56Sopenharmony_ci            except StopIteration:
6937db96d56Sopenharmony_ci                # Remove an exhausted iterator.
6947db96d56Sopenharmony_ci                iterators.popleft()
6957db96d56Sopenharmony_ci
6967db96d56Sopenharmony_ciThe :meth:`~deque.rotate` method provides a way to implement :class:`deque` slicing and
6977db96d56Sopenharmony_cideletion.  For example, a pure Python implementation of ``del d[n]`` relies on
6987db96d56Sopenharmony_cithe ``rotate()`` method to position elements to be popped::
6997db96d56Sopenharmony_ci
7007db96d56Sopenharmony_ci    def delete_nth(d, n):
7017db96d56Sopenharmony_ci        d.rotate(-n)
7027db96d56Sopenharmony_ci        d.popleft()
7037db96d56Sopenharmony_ci        d.rotate(n)
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ciTo implement :class:`deque` slicing, use a similar approach applying
7067db96d56Sopenharmony_ci:meth:`~deque.rotate` to bring a target element to the left side of the deque. Remove
7077db96d56Sopenharmony_ciold entries with :meth:`~deque.popleft`, add new entries with :meth:`~deque.extend`, and then
7087db96d56Sopenharmony_cireverse the rotation.
7097db96d56Sopenharmony_ciWith minor variations on that approach, it is easy to implement Forth style
7107db96d56Sopenharmony_cistack manipulations such as ``dup``, ``drop``, ``swap``, ``over``, ``pick``,
7117db96d56Sopenharmony_ci``rot``, and ``roll``.
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_ci
7147db96d56Sopenharmony_ci:class:`defaultdict` objects
7157db96d56Sopenharmony_ci----------------------------
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci.. class:: defaultdict(default_factory=None, /, [...])
7187db96d56Sopenharmony_ci
7197db96d56Sopenharmony_ci    Return a new dictionary-like object.  :class:`defaultdict` is a subclass of the
7207db96d56Sopenharmony_ci    built-in :class:`dict` class.  It overrides one method and adds one writable
7217db96d56Sopenharmony_ci    instance variable.  The remaining functionality is the same as for the
7227db96d56Sopenharmony_ci    :class:`dict` class and is not documented here.
7237db96d56Sopenharmony_ci
7247db96d56Sopenharmony_ci    The first argument provides the initial value for the :attr:`default_factory`
7257db96d56Sopenharmony_ci    attribute; it defaults to ``None``. All remaining arguments are treated the same
7267db96d56Sopenharmony_ci    as if they were passed to the :class:`dict` constructor, including keyword
7277db96d56Sopenharmony_ci    arguments.
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ci
7307db96d56Sopenharmony_ci    :class:`defaultdict` objects support the following method in addition to the
7317db96d56Sopenharmony_ci    standard :class:`dict` operations:
7327db96d56Sopenharmony_ci
7337db96d56Sopenharmony_ci    .. method:: __missing__(key)
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_ci        If the :attr:`default_factory` attribute is ``None``, this raises a
7367db96d56Sopenharmony_ci        :exc:`KeyError` exception with the *key* as argument.
7377db96d56Sopenharmony_ci
7387db96d56Sopenharmony_ci        If :attr:`default_factory` is not ``None``, it is called without arguments
7397db96d56Sopenharmony_ci        to provide a default value for the given *key*, this value is inserted in
7407db96d56Sopenharmony_ci        the dictionary for the *key*, and returned.
7417db96d56Sopenharmony_ci
7427db96d56Sopenharmony_ci        If calling :attr:`default_factory` raises an exception this exception is
7437db96d56Sopenharmony_ci        propagated unchanged.
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ci        This method is called by the :meth:`__getitem__` method of the
7467db96d56Sopenharmony_ci        :class:`dict` class when the requested key is not found; whatever it
7477db96d56Sopenharmony_ci        returns or raises is then returned or raised by :meth:`__getitem__`.
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ci        Note that :meth:`__missing__` is *not* called for any operations besides
7507db96d56Sopenharmony_ci        :meth:`__getitem__`. This means that :meth:`get` will, like normal
7517db96d56Sopenharmony_ci        dictionaries, return ``None`` as a default rather than using
7527db96d56Sopenharmony_ci        :attr:`default_factory`.
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ci    :class:`defaultdict` objects support the following instance variable:
7567db96d56Sopenharmony_ci
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci    .. attribute:: default_factory
7597db96d56Sopenharmony_ci
7607db96d56Sopenharmony_ci        This attribute is used by the :meth:`__missing__` method; it is
7617db96d56Sopenharmony_ci        initialized from the first argument to the constructor, if present, or to
7627db96d56Sopenharmony_ci        ``None``, if absent.
7637db96d56Sopenharmony_ci
7647db96d56Sopenharmony_ci    .. versionchanged:: 3.9
7657db96d56Sopenharmony_ci       Added merge (``|``) and update (``|=``) operators, specified in
7667db96d56Sopenharmony_ci       :pep:`584`.
7677db96d56Sopenharmony_ci
7687db96d56Sopenharmony_ci
7697db96d56Sopenharmony_ci:class:`defaultdict` Examples
7707db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
7717db96d56Sopenharmony_ci
7727db96d56Sopenharmony_ciUsing :class:`list` as the :attr:`~defaultdict.default_factory`, it is easy to group a
7737db96d56Sopenharmony_cisequence of key-value pairs into a dictionary of lists:
7747db96d56Sopenharmony_ci
7757db96d56Sopenharmony_ci    >>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
7767db96d56Sopenharmony_ci    >>> d = defaultdict(list)
7777db96d56Sopenharmony_ci    >>> for k, v in s:
7787db96d56Sopenharmony_ci    ...     d[k].append(v)
7797db96d56Sopenharmony_ci    ...
7807db96d56Sopenharmony_ci    >>> sorted(d.items())
7817db96d56Sopenharmony_ci    [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
7827db96d56Sopenharmony_ci
7837db96d56Sopenharmony_ciWhen each key is encountered for the first time, it is not already in the
7847db96d56Sopenharmony_cimapping; so an entry is automatically created using the :attr:`~defaultdict.default_factory`
7857db96d56Sopenharmony_cifunction which returns an empty :class:`list`.  The :meth:`list.append`
7867db96d56Sopenharmony_cioperation then attaches the value to the new list.  When keys are encountered
7877db96d56Sopenharmony_ciagain, the look-up proceeds normally (returning the list for that key) and the
7887db96d56Sopenharmony_ci:meth:`list.append` operation adds another value to the list. This technique is
7897db96d56Sopenharmony_cisimpler and faster than an equivalent technique using :meth:`dict.setdefault`:
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ci    >>> d = {}
7927db96d56Sopenharmony_ci    >>> for k, v in s:
7937db96d56Sopenharmony_ci    ...     d.setdefault(k, []).append(v)
7947db96d56Sopenharmony_ci    ...
7957db96d56Sopenharmony_ci    >>> sorted(d.items())
7967db96d56Sopenharmony_ci    [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
7977db96d56Sopenharmony_ci
7987db96d56Sopenharmony_ciSetting the :attr:`~defaultdict.default_factory` to :class:`int` makes the
7997db96d56Sopenharmony_ci:class:`defaultdict` useful for counting (like a bag or multiset in other
8007db96d56Sopenharmony_cilanguages):
8017db96d56Sopenharmony_ci
8027db96d56Sopenharmony_ci    >>> s = 'mississippi'
8037db96d56Sopenharmony_ci    >>> d = defaultdict(int)
8047db96d56Sopenharmony_ci    >>> for k in s:
8057db96d56Sopenharmony_ci    ...     d[k] += 1
8067db96d56Sopenharmony_ci    ...
8077db96d56Sopenharmony_ci    >>> sorted(d.items())
8087db96d56Sopenharmony_ci    [('i', 4), ('m', 1), ('p', 2), ('s', 4)]
8097db96d56Sopenharmony_ci
8107db96d56Sopenharmony_ciWhen a letter is first encountered, it is missing from the mapping, so the
8117db96d56Sopenharmony_ci:attr:`~defaultdict.default_factory` function calls :func:`int` to supply a default count of
8127db96d56Sopenharmony_cizero.  The increment operation then builds up the count for each letter.
8137db96d56Sopenharmony_ci
8147db96d56Sopenharmony_ciThe function :func:`int` which always returns zero is just a special case of
8157db96d56Sopenharmony_ciconstant functions.  A faster and more flexible way to create constant functions
8167db96d56Sopenharmony_ciis to use a lambda function which can supply any constant value (not just
8177db96d56Sopenharmony_cizero):
8187db96d56Sopenharmony_ci
8197db96d56Sopenharmony_ci    >>> def constant_factory(value):
8207db96d56Sopenharmony_ci    ...     return lambda: value
8217db96d56Sopenharmony_ci    >>> d = defaultdict(constant_factory('<missing>'))
8227db96d56Sopenharmony_ci    >>> d.update(name='John', action='ran')
8237db96d56Sopenharmony_ci    >>> '%(name)s %(action)s to %(object)s' % d
8247db96d56Sopenharmony_ci    'John ran to <missing>'
8257db96d56Sopenharmony_ci
8267db96d56Sopenharmony_ciSetting the :attr:`~defaultdict.default_factory` to :class:`set` makes the
8277db96d56Sopenharmony_ci:class:`defaultdict` useful for building a dictionary of sets:
8287db96d56Sopenharmony_ci
8297db96d56Sopenharmony_ci    >>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
8307db96d56Sopenharmony_ci    >>> d = defaultdict(set)
8317db96d56Sopenharmony_ci    >>> for k, v in s:
8327db96d56Sopenharmony_ci    ...     d[k].add(v)
8337db96d56Sopenharmony_ci    ...
8347db96d56Sopenharmony_ci    >>> sorted(d.items())
8357db96d56Sopenharmony_ci    [('blue', {2, 4}), ('red', {1, 3})]
8367db96d56Sopenharmony_ci
8377db96d56Sopenharmony_ci
8387db96d56Sopenharmony_ci:func:`namedtuple` Factory Function for Tuples with Named Fields
8397db96d56Sopenharmony_ci----------------------------------------------------------------
8407db96d56Sopenharmony_ci
8417db96d56Sopenharmony_ciNamed tuples assign meaning to each position in a tuple and allow for more readable,
8427db96d56Sopenharmony_ciself-documenting code.  They can be used wherever regular tuples are used, and
8437db96d56Sopenharmony_cithey add the ability to access fields by name instead of position index.
8447db96d56Sopenharmony_ci
8457db96d56Sopenharmony_ci.. function:: namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
8467db96d56Sopenharmony_ci
8477db96d56Sopenharmony_ci    Returns a new tuple subclass named *typename*.  The new subclass is used to
8487db96d56Sopenharmony_ci    create tuple-like objects that have fields accessible by attribute lookup as
8497db96d56Sopenharmony_ci    well as being indexable and iterable.  Instances of the subclass also have a
8507db96d56Sopenharmony_ci    helpful docstring (with typename and field_names) and a helpful :meth:`__repr__`
8517db96d56Sopenharmony_ci    method which lists the tuple contents in a ``name=value`` format.
8527db96d56Sopenharmony_ci
8537db96d56Sopenharmony_ci    The *field_names* are a sequence of strings such as ``['x', 'y']``.
8547db96d56Sopenharmony_ci    Alternatively, *field_names* can be a single string with each fieldname
8557db96d56Sopenharmony_ci    separated by whitespace and/or commas, for example ``'x y'`` or ``'x, y'``.
8567db96d56Sopenharmony_ci
8577db96d56Sopenharmony_ci    Any valid Python identifier may be used for a fieldname except for names
8587db96d56Sopenharmony_ci    starting with an underscore.  Valid identifiers consist of letters, digits,
8597db96d56Sopenharmony_ci    and underscores but do not start with a digit or underscore and cannot be
8607db96d56Sopenharmony_ci    a :mod:`keyword` such as *class*, *for*, *return*, *global*, *pass*,
8617db96d56Sopenharmony_ci    or *raise*.
8627db96d56Sopenharmony_ci
8637db96d56Sopenharmony_ci    If *rename* is true, invalid fieldnames are automatically replaced
8647db96d56Sopenharmony_ci    with positional names.  For example, ``['abc', 'def', 'ghi', 'abc']`` is
8657db96d56Sopenharmony_ci    converted to ``['abc', '_1', 'ghi', '_3']``, eliminating the keyword
8667db96d56Sopenharmony_ci    ``def`` and the duplicate fieldname ``abc``.
8677db96d56Sopenharmony_ci
8687db96d56Sopenharmony_ci    *defaults* can be ``None`` or an :term:`iterable` of default values.
8697db96d56Sopenharmony_ci    Since fields with a default value must come after any fields without a
8707db96d56Sopenharmony_ci    default, the *defaults* are applied to the rightmost parameters.  For
8717db96d56Sopenharmony_ci    example, if the fieldnames are ``['x', 'y', 'z']`` and the defaults are
8727db96d56Sopenharmony_ci    ``(1, 2)``, then ``x`` will be a required argument, ``y`` will default to
8737db96d56Sopenharmony_ci    ``1``, and ``z`` will default to ``2``.
8747db96d56Sopenharmony_ci
8757db96d56Sopenharmony_ci    If *module* is defined, the ``__module__`` attribute of the named tuple is
8767db96d56Sopenharmony_ci    set to that value.
8777db96d56Sopenharmony_ci
8787db96d56Sopenharmony_ci    Named tuple instances do not have per-instance dictionaries, so they are
8797db96d56Sopenharmony_ci    lightweight and require no more memory than regular tuples.
8807db96d56Sopenharmony_ci
8817db96d56Sopenharmony_ci    To support pickling, the named tuple class should be assigned to a variable
8827db96d56Sopenharmony_ci    that matches *typename*.
8837db96d56Sopenharmony_ci
8847db96d56Sopenharmony_ci    .. versionchanged:: 3.1
8857db96d56Sopenharmony_ci       Added support for *rename*.
8867db96d56Sopenharmony_ci
8877db96d56Sopenharmony_ci    .. versionchanged:: 3.6
8887db96d56Sopenharmony_ci       The *verbose* and *rename* parameters became
8897db96d56Sopenharmony_ci       :ref:`keyword-only arguments <keyword-only_parameter>`.
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ci    .. versionchanged:: 3.6
8927db96d56Sopenharmony_ci       Added the *module* parameter.
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_ci    .. versionchanged:: 3.7
8957db96d56Sopenharmony_ci       Removed the *verbose* parameter and the :attr:`_source` attribute.
8967db96d56Sopenharmony_ci
8977db96d56Sopenharmony_ci    .. versionchanged:: 3.7
8987db96d56Sopenharmony_ci       Added the *defaults* parameter and the :attr:`_field_defaults`
8997db96d56Sopenharmony_ci       attribute.
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci.. doctest::
9027db96d56Sopenharmony_ci    :options: +NORMALIZE_WHITESPACE
9037db96d56Sopenharmony_ci
9047db96d56Sopenharmony_ci    >>> # Basic example
9057db96d56Sopenharmony_ci    >>> Point = namedtuple('Point', ['x', 'y'])
9067db96d56Sopenharmony_ci    >>> p = Point(11, y=22)     # instantiate with positional or keyword arguments
9077db96d56Sopenharmony_ci    >>> p[0] + p[1]             # indexable like the plain tuple (11, 22)
9087db96d56Sopenharmony_ci    33
9097db96d56Sopenharmony_ci    >>> x, y = p                # unpack like a regular tuple
9107db96d56Sopenharmony_ci    >>> x, y
9117db96d56Sopenharmony_ci    (11, 22)
9127db96d56Sopenharmony_ci    >>> p.x + p.y               # fields also accessible by name
9137db96d56Sopenharmony_ci    33
9147db96d56Sopenharmony_ci    >>> p                       # readable __repr__ with a name=value style
9157db96d56Sopenharmony_ci    Point(x=11, y=22)
9167db96d56Sopenharmony_ci
9177db96d56Sopenharmony_ciNamed tuples are especially useful for assigning field names to result tuples returned
9187db96d56Sopenharmony_ciby the :mod:`csv` or :mod:`sqlite3` modules::
9197db96d56Sopenharmony_ci
9207db96d56Sopenharmony_ci    EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
9217db96d56Sopenharmony_ci
9227db96d56Sopenharmony_ci    import csv
9237db96d56Sopenharmony_ci    for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
9247db96d56Sopenharmony_ci        print(emp.name, emp.title)
9257db96d56Sopenharmony_ci
9267db96d56Sopenharmony_ci    import sqlite3
9277db96d56Sopenharmony_ci    conn = sqlite3.connect('/companydata')
9287db96d56Sopenharmony_ci    cursor = conn.cursor()
9297db96d56Sopenharmony_ci    cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
9307db96d56Sopenharmony_ci    for emp in map(EmployeeRecord._make, cursor.fetchall()):
9317db96d56Sopenharmony_ci        print(emp.name, emp.title)
9327db96d56Sopenharmony_ci
9337db96d56Sopenharmony_ciIn addition to the methods inherited from tuples, named tuples support
9347db96d56Sopenharmony_cithree additional methods and two attributes.  To prevent conflicts with
9357db96d56Sopenharmony_cifield names, the method and attribute names start with an underscore.
9367db96d56Sopenharmony_ci
9377db96d56Sopenharmony_ci.. classmethod:: somenamedtuple._make(iterable)
9387db96d56Sopenharmony_ci
9397db96d56Sopenharmony_ci    Class method that makes a new instance from an existing sequence or iterable.
9407db96d56Sopenharmony_ci
9417db96d56Sopenharmony_ci    .. doctest::
9427db96d56Sopenharmony_ci
9437db96d56Sopenharmony_ci        >>> t = [11, 22]
9447db96d56Sopenharmony_ci        >>> Point._make(t)
9457db96d56Sopenharmony_ci        Point(x=11, y=22)
9467db96d56Sopenharmony_ci
9477db96d56Sopenharmony_ci.. method:: somenamedtuple._asdict()
9487db96d56Sopenharmony_ci
9497db96d56Sopenharmony_ci    Return a new :class:`dict` which maps field names to their corresponding
9507db96d56Sopenharmony_ci    values:
9517db96d56Sopenharmony_ci
9527db96d56Sopenharmony_ci    .. doctest::
9537db96d56Sopenharmony_ci
9547db96d56Sopenharmony_ci        >>> p = Point(x=11, y=22)
9557db96d56Sopenharmony_ci        >>> p._asdict()
9567db96d56Sopenharmony_ci        {'x': 11, 'y': 22}
9577db96d56Sopenharmony_ci
9587db96d56Sopenharmony_ci    .. versionchanged:: 3.1
9597db96d56Sopenharmony_ci        Returns an :class:`OrderedDict` instead of a regular :class:`dict`.
9607db96d56Sopenharmony_ci
9617db96d56Sopenharmony_ci    .. versionchanged:: 3.8
9627db96d56Sopenharmony_ci        Returns a regular :class:`dict` instead of an :class:`OrderedDict`.
9637db96d56Sopenharmony_ci        As of Python 3.7, regular dicts are guaranteed to be ordered.  If the
9647db96d56Sopenharmony_ci        extra features of :class:`OrderedDict` are required, the suggested
9657db96d56Sopenharmony_ci        remediation is to cast the result to the desired type:
9667db96d56Sopenharmony_ci        ``OrderedDict(nt._asdict())``.
9677db96d56Sopenharmony_ci
9687db96d56Sopenharmony_ci.. method:: somenamedtuple._replace(**kwargs)
9697db96d56Sopenharmony_ci
9707db96d56Sopenharmony_ci    Return a new instance of the named tuple replacing specified fields with new
9717db96d56Sopenharmony_ci    values::
9727db96d56Sopenharmony_ci
9737db96d56Sopenharmony_ci        >>> p = Point(x=11, y=22)
9747db96d56Sopenharmony_ci        >>> p._replace(x=33)
9757db96d56Sopenharmony_ci        Point(x=33, y=22)
9767db96d56Sopenharmony_ci
9777db96d56Sopenharmony_ci        >>> for partnum, record in inventory.items():
9787db96d56Sopenharmony_ci        ...     inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci.. attribute:: somenamedtuple._fields
9817db96d56Sopenharmony_ci
9827db96d56Sopenharmony_ci    Tuple of strings listing the field names.  Useful for introspection
9837db96d56Sopenharmony_ci    and for creating new named tuple types from existing named tuples.
9847db96d56Sopenharmony_ci
9857db96d56Sopenharmony_ci    .. doctest::
9867db96d56Sopenharmony_ci
9877db96d56Sopenharmony_ci        >>> p._fields            # view the field names
9887db96d56Sopenharmony_ci        ('x', 'y')
9897db96d56Sopenharmony_ci
9907db96d56Sopenharmony_ci        >>> Color = namedtuple('Color', 'red green blue')
9917db96d56Sopenharmony_ci        >>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
9927db96d56Sopenharmony_ci        >>> Pixel(11, 22, 128, 255, 0)
9937db96d56Sopenharmony_ci        Pixel(x=11, y=22, red=128, green=255, blue=0)
9947db96d56Sopenharmony_ci
9957db96d56Sopenharmony_ci.. attribute:: somenamedtuple._field_defaults
9967db96d56Sopenharmony_ci
9977db96d56Sopenharmony_ci   Dictionary mapping field names to default values.
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ci   .. doctest::
10007db96d56Sopenharmony_ci
10017db96d56Sopenharmony_ci        >>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
10027db96d56Sopenharmony_ci        >>> Account._field_defaults
10037db96d56Sopenharmony_ci        {'balance': 0}
10047db96d56Sopenharmony_ci        >>> Account('premium')
10057db96d56Sopenharmony_ci        Account(type='premium', balance=0)
10067db96d56Sopenharmony_ci
10077db96d56Sopenharmony_ciTo retrieve a field whose name is stored in a string, use the :func:`getattr`
10087db96d56Sopenharmony_cifunction:
10097db96d56Sopenharmony_ci
10107db96d56Sopenharmony_ci    >>> getattr(p, 'x')
10117db96d56Sopenharmony_ci    11
10127db96d56Sopenharmony_ci
10137db96d56Sopenharmony_ciTo convert a dictionary to a named tuple, use the double-star-operator
10147db96d56Sopenharmony_ci(as described in :ref:`tut-unpacking-arguments`):
10157db96d56Sopenharmony_ci
10167db96d56Sopenharmony_ci    >>> d = {'x': 11, 'y': 22}
10177db96d56Sopenharmony_ci    >>> Point(**d)
10187db96d56Sopenharmony_ci    Point(x=11, y=22)
10197db96d56Sopenharmony_ci
10207db96d56Sopenharmony_ciSince a named tuple is a regular Python class, it is easy to add or change
10217db96d56Sopenharmony_cifunctionality with a subclass.  Here is how to add a calculated field and
10227db96d56Sopenharmony_cia fixed-width print format:
10237db96d56Sopenharmony_ci
10247db96d56Sopenharmony_ci.. doctest::
10257db96d56Sopenharmony_ci
10267db96d56Sopenharmony_ci    >>> class Point(namedtuple('Point', ['x', 'y'])):
10277db96d56Sopenharmony_ci    ...     __slots__ = ()
10287db96d56Sopenharmony_ci    ...     @property
10297db96d56Sopenharmony_ci    ...     def hypot(self):
10307db96d56Sopenharmony_ci    ...         return (self.x ** 2 + self.y ** 2) ** 0.5
10317db96d56Sopenharmony_ci    ...     def __str__(self):
10327db96d56Sopenharmony_ci    ...         return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)
10337db96d56Sopenharmony_ci
10347db96d56Sopenharmony_ci    >>> for p in Point(3, 4), Point(14, 5/7):
10357db96d56Sopenharmony_ci    ...     print(p)
10367db96d56Sopenharmony_ci    Point: x= 3.000  y= 4.000  hypot= 5.000
10377db96d56Sopenharmony_ci    Point: x=14.000  y= 0.714  hypot=14.018
10387db96d56Sopenharmony_ci
10397db96d56Sopenharmony_ciThe subclass shown above sets ``__slots__`` to an empty tuple.  This helps
10407db96d56Sopenharmony_cikeep memory requirements low by preventing the creation of instance dictionaries.
10417db96d56Sopenharmony_ci
10427db96d56Sopenharmony_ciSubclassing is not useful for adding new, stored fields.  Instead, simply
10437db96d56Sopenharmony_cicreate a new named tuple type from the :attr:`~somenamedtuple._fields` attribute:
10447db96d56Sopenharmony_ci
10457db96d56Sopenharmony_ci    >>> Point3D = namedtuple('Point3D', Point._fields + ('z',))
10467db96d56Sopenharmony_ci
10477db96d56Sopenharmony_ciDocstrings can be customized by making direct assignments to the ``__doc__``
10487db96d56Sopenharmony_cifields:
10497db96d56Sopenharmony_ci
10507db96d56Sopenharmony_ci   >>> Book = namedtuple('Book', ['id', 'title', 'authors'])
10517db96d56Sopenharmony_ci   >>> Book.__doc__ += ': Hardcover book in active collection'
10527db96d56Sopenharmony_ci   >>> Book.id.__doc__ = '13-digit ISBN'
10537db96d56Sopenharmony_ci   >>> Book.title.__doc__ = 'Title of first printing'
10547db96d56Sopenharmony_ci   >>> Book.authors.__doc__ = 'List of authors sorted by last name'
10557db96d56Sopenharmony_ci
10567db96d56Sopenharmony_ci.. versionchanged:: 3.5
10577db96d56Sopenharmony_ci   Property docstrings became writeable.
10587db96d56Sopenharmony_ci
10597db96d56Sopenharmony_ci.. seealso::
10607db96d56Sopenharmony_ci
10617db96d56Sopenharmony_ci    * See :class:`typing.NamedTuple` for a way to add type hints for named
10627db96d56Sopenharmony_ci      tuples.  It also provides an elegant notation using the :keyword:`class`
10637db96d56Sopenharmony_ci      keyword::
10647db96d56Sopenharmony_ci
10657db96d56Sopenharmony_ci          class Component(NamedTuple):
10667db96d56Sopenharmony_ci              part_number: int
10677db96d56Sopenharmony_ci              weight: float
10687db96d56Sopenharmony_ci              description: Optional[str] = None
10697db96d56Sopenharmony_ci
10707db96d56Sopenharmony_ci    * See :meth:`types.SimpleNamespace` for a mutable namespace based on an
10717db96d56Sopenharmony_ci      underlying dictionary instead of a tuple.
10727db96d56Sopenharmony_ci
10737db96d56Sopenharmony_ci    * The :mod:`dataclasses` module provides a decorator and functions for
10747db96d56Sopenharmony_ci      automatically adding generated special methods to user-defined classes.
10757db96d56Sopenharmony_ci
10767db96d56Sopenharmony_ci
10777db96d56Sopenharmony_ci:class:`OrderedDict` objects
10787db96d56Sopenharmony_ci----------------------------
10797db96d56Sopenharmony_ci
10807db96d56Sopenharmony_ciOrdered dictionaries are just like regular dictionaries but have some extra
10817db96d56Sopenharmony_cicapabilities relating to ordering operations.  They have become less
10827db96d56Sopenharmony_ciimportant now that the built-in :class:`dict` class gained the ability
10837db96d56Sopenharmony_cito remember insertion order (this new behavior became guaranteed in
10847db96d56Sopenharmony_ciPython 3.7).
10857db96d56Sopenharmony_ci
10867db96d56Sopenharmony_ciSome differences from :class:`dict` still remain:
10877db96d56Sopenharmony_ci
10887db96d56Sopenharmony_ci* The regular :class:`dict` was designed to be very good at mapping
10897db96d56Sopenharmony_ci  operations.  Tracking insertion order was secondary.
10907db96d56Sopenharmony_ci
10917db96d56Sopenharmony_ci* The :class:`OrderedDict` was designed to be good at reordering operations.
10927db96d56Sopenharmony_ci  Space efficiency, iteration speed, and the performance of update
10937db96d56Sopenharmony_ci  operations were secondary.
10947db96d56Sopenharmony_ci
10957db96d56Sopenharmony_ci* The :class:`OrderedDict` algorithm can handle frequent reordering operations
10967db96d56Sopenharmony_ci  better than :class:`dict`.  As shown in the recipes below, this makes it
10977db96d56Sopenharmony_ci  suitable for implementing various kinds of LRU caches.
10987db96d56Sopenharmony_ci
10997db96d56Sopenharmony_ci* The equality operation for :class:`OrderedDict` checks for matching order.
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ci  A regular :class:`dict` can emulate the order sensitive equality test with
11027db96d56Sopenharmony_ci  ``p == q and all(k1 == k2 for k1, k2 in zip(p, q))``.
11037db96d56Sopenharmony_ci
11047db96d56Sopenharmony_ci* The :meth:`popitem` method of :class:`OrderedDict` has a different
11057db96d56Sopenharmony_ci  signature.  It accepts an optional argument to specify which item is popped.
11067db96d56Sopenharmony_ci
11077db96d56Sopenharmony_ci  A regular :class:`dict` can emulate OrderedDict's ``od.popitem(last=True)``
11087db96d56Sopenharmony_ci  with ``d.popitem()`` which is guaranteed to pop the rightmost (last) item.
11097db96d56Sopenharmony_ci
11107db96d56Sopenharmony_ci  A regular :class:`dict` can emulate OrderedDict's ``od.popitem(last=False)``
11117db96d56Sopenharmony_ci  with ``(k := next(iter(d)), d.pop(k))`` which will return and remove the
11127db96d56Sopenharmony_ci  leftmost (first) item if it exists.
11137db96d56Sopenharmony_ci
11147db96d56Sopenharmony_ci* :class:`OrderedDict` has a :meth:`move_to_end` method to efficiently
11157db96d56Sopenharmony_ci  reposition an element to an endpoint.
11167db96d56Sopenharmony_ci
11177db96d56Sopenharmony_ci  A regular :class:`dict` can emulate OrderedDict's ``od.move_to_end(k,
11187db96d56Sopenharmony_ci  last=True)`` with ``d[k] = d.pop(k)`` which will move the key and its
11197db96d56Sopenharmony_ci  associated value to the rightmost (last) position.
11207db96d56Sopenharmony_ci
11217db96d56Sopenharmony_ci  A regular :class:`dict` does not have an efficient equivalent for
11227db96d56Sopenharmony_ci  OrderedDict's ``od.move_to_end(k, last=False)`` which moves the key
11237db96d56Sopenharmony_ci  and its associated value to the leftmost (first) position.
11247db96d56Sopenharmony_ci
11257db96d56Sopenharmony_ci* Until Python 3.8, :class:`dict` lacked a :meth:`__reversed__` method.
11267db96d56Sopenharmony_ci
11277db96d56Sopenharmony_ci
11287db96d56Sopenharmony_ci.. class:: OrderedDict([items])
11297db96d56Sopenharmony_ci
11307db96d56Sopenharmony_ci    Return an instance of a :class:`dict` subclass that has methods
11317db96d56Sopenharmony_ci    specialized for rearranging dictionary order.
11327db96d56Sopenharmony_ci
11337db96d56Sopenharmony_ci    .. versionadded:: 3.1
11347db96d56Sopenharmony_ci
11357db96d56Sopenharmony_ci    .. method:: popitem(last=True)
11367db96d56Sopenharmony_ci
11377db96d56Sopenharmony_ci        The :meth:`popitem` method for ordered dictionaries returns and removes a
11387db96d56Sopenharmony_ci        (key, value) pair.  The pairs are returned in
11397db96d56Sopenharmony_ci        :abbr:`LIFO (last-in, first-out)` order if *last* is true
11407db96d56Sopenharmony_ci        or :abbr:`FIFO (first-in, first-out)` order if false.
11417db96d56Sopenharmony_ci
11427db96d56Sopenharmony_ci    .. method:: move_to_end(key, last=True)
11437db96d56Sopenharmony_ci
11447db96d56Sopenharmony_ci        Move an existing *key* to either end of an ordered dictionary.  The item
11457db96d56Sopenharmony_ci        is moved to the right end if *last* is true (the default) or to the
11467db96d56Sopenharmony_ci        beginning if *last* is false.  Raises :exc:`KeyError` if the *key* does
11477db96d56Sopenharmony_ci        not exist:
11487db96d56Sopenharmony_ci
11497db96d56Sopenharmony_ci        .. doctest::
11507db96d56Sopenharmony_ci
11517db96d56Sopenharmony_ci            >>> d = OrderedDict.fromkeys('abcde')
11527db96d56Sopenharmony_ci            >>> d.move_to_end('b')
11537db96d56Sopenharmony_ci            >>> ''.join(d)
11547db96d56Sopenharmony_ci            'acdeb'
11557db96d56Sopenharmony_ci            >>> d.move_to_end('b', last=False)
11567db96d56Sopenharmony_ci            >>> ''.join(d)
11577db96d56Sopenharmony_ci            'bacde'
11587db96d56Sopenharmony_ci
11597db96d56Sopenharmony_ci        .. versionadded:: 3.2
11607db96d56Sopenharmony_ci
11617db96d56Sopenharmony_ciIn addition to the usual mapping methods, ordered dictionaries also support
11627db96d56Sopenharmony_cireverse iteration using :func:`reversed`.
11637db96d56Sopenharmony_ci
11647db96d56Sopenharmony_ciEquality tests between :class:`OrderedDict` objects are order-sensitive
11657db96d56Sopenharmony_ciand are implemented as ``list(od1.items())==list(od2.items())``.
11667db96d56Sopenharmony_ciEquality tests between :class:`OrderedDict` objects and other
11677db96d56Sopenharmony_ci:class:`~collections.abc.Mapping` objects are order-insensitive like regular
11687db96d56Sopenharmony_cidictionaries.  This allows :class:`OrderedDict` objects to be substituted
11697db96d56Sopenharmony_cianywhere a regular dictionary is used.
11707db96d56Sopenharmony_ci
11717db96d56Sopenharmony_ci.. versionchanged:: 3.5
11727db96d56Sopenharmony_ci   The items, keys, and values :term:`views <dictionary view>`
11737db96d56Sopenharmony_ci   of :class:`OrderedDict` now support reverse iteration using :func:`reversed`.
11747db96d56Sopenharmony_ci
11757db96d56Sopenharmony_ci.. versionchanged:: 3.6
11767db96d56Sopenharmony_ci   With the acceptance of :pep:`468`, order is retained for keyword arguments
11777db96d56Sopenharmony_ci   passed to the :class:`OrderedDict` constructor and its :meth:`update`
11787db96d56Sopenharmony_ci   method.
11797db96d56Sopenharmony_ci
11807db96d56Sopenharmony_ci.. versionchanged:: 3.9
11817db96d56Sopenharmony_ci    Added merge (``|``) and update (``|=``) operators, specified in :pep:`584`.
11827db96d56Sopenharmony_ci
11837db96d56Sopenharmony_ci
11847db96d56Sopenharmony_ci:class:`OrderedDict` Examples and Recipes
11857db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
11867db96d56Sopenharmony_ci
11877db96d56Sopenharmony_ciIt is straightforward to create an ordered dictionary variant
11887db96d56Sopenharmony_cithat remembers the order the keys were *last* inserted.
11897db96d56Sopenharmony_ciIf a new entry overwrites an existing entry, the
11907db96d56Sopenharmony_cioriginal insertion position is changed and moved to the end::
11917db96d56Sopenharmony_ci
11927db96d56Sopenharmony_ci    class LastUpdatedOrderedDict(OrderedDict):
11937db96d56Sopenharmony_ci        'Store items in the order the keys were last added'
11947db96d56Sopenharmony_ci
11957db96d56Sopenharmony_ci        def __setitem__(self, key, value):
11967db96d56Sopenharmony_ci            super().__setitem__(key, value)
11977db96d56Sopenharmony_ci            self.move_to_end(key)
11987db96d56Sopenharmony_ci
11997db96d56Sopenharmony_ciAn :class:`OrderedDict` would also be useful for implementing
12007db96d56Sopenharmony_civariants of :func:`functools.lru_cache`:
12017db96d56Sopenharmony_ci
12027db96d56Sopenharmony_ci.. testcode::
12037db96d56Sopenharmony_ci
12047db96d56Sopenharmony_ci    from time import time
12057db96d56Sopenharmony_ci
12067db96d56Sopenharmony_ci    class TimeBoundedLRU:
12077db96d56Sopenharmony_ci        "LRU Cache that invalidates and refreshes old entries."
12087db96d56Sopenharmony_ci
12097db96d56Sopenharmony_ci        def __init__(self, func, maxsize=128, maxage=30):
12107db96d56Sopenharmony_ci            self.cache = OrderedDict()      # { args : (timestamp, result)}
12117db96d56Sopenharmony_ci            self.func = func
12127db96d56Sopenharmony_ci            self.maxsize = maxsize
12137db96d56Sopenharmony_ci            self.maxage = maxage
12147db96d56Sopenharmony_ci
12157db96d56Sopenharmony_ci        def __call__(self, *args):
12167db96d56Sopenharmony_ci            if args in self.cache:
12177db96d56Sopenharmony_ci                self.cache.move_to_end(args)
12187db96d56Sopenharmony_ci                timestamp, result = self.cache[args]
12197db96d56Sopenharmony_ci                if time() - timestamp <= self.maxage:
12207db96d56Sopenharmony_ci                    return result
12217db96d56Sopenharmony_ci            result = self.func(*args)
12227db96d56Sopenharmony_ci            self.cache[args] = time(), result
12237db96d56Sopenharmony_ci            if len(self.cache) > self.maxsize:
12247db96d56Sopenharmony_ci                self.cache.popitem(0)
12257db96d56Sopenharmony_ci            return result
12267db96d56Sopenharmony_ci
12277db96d56Sopenharmony_ci
12287db96d56Sopenharmony_ci.. testcode::
12297db96d56Sopenharmony_ci
12307db96d56Sopenharmony_ci    class MultiHitLRUCache:
12317db96d56Sopenharmony_ci        """ LRU cache that defers caching a result until
12327db96d56Sopenharmony_ci            it has been requested multiple times.
12337db96d56Sopenharmony_ci
12347db96d56Sopenharmony_ci            To avoid flushing the LRU cache with one-time requests,
12357db96d56Sopenharmony_ci            we don't cache until a request has been made more than once.
12367db96d56Sopenharmony_ci
12377db96d56Sopenharmony_ci        """
12387db96d56Sopenharmony_ci
12397db96d56Sopenharmony_ci        def __init__(self, func, maxsize=128, maxrequests=4096, cache_after=1):
12407db96d56Sopenharmony_ci            self.requests = OrderedDict()   # { uncached_key : request_count }
12417db96d56Sopenharmony_ci            self.cache = OrderedDict()      # { cached_key : function_result }
12427db96d56Sopenharmony_ci            self.func = func
12437db96d56Sopenharmony_ci            self.maxrequests = maxrequests  # max number of uncached requests
12447db96d56Sopenharmony_ci            self.maxsize = maxsize          # max number of stored return values
12457db96d56Sopenharmony_ci            self.cache_after = cache_after
12467db96d56Sopenharmony_ci
12477db96d56Sopenharmony_ci        def __call__(self, *args):
12487db96d56Sopenharmony_ci            if args in self.cache:
12497db96d56Sopenharmony_ci                self.cache.move_to_end(args)
12507db96d56Sopenharmony_ci                return self.cache[args]
12517db96d56Sopenharmony_ci            result = self.func(*args)
12527db96d56Sopenharmony_ci            self.requests[args] = self.requests.get(args, 0) + 1
12537db96d56Sopenharmony_ci            if self.requests[args] <= self.cache_after:
12547db96d56Sopenharmony_ci                self.requests.move_to_end(args)
12557db96d56Sopenharmony_ci                if len(self.requests) > self.maxrequests:
12567db96d56Sopenharmony_ci                    self.requests.popitem(0)
12577db96d56Sopenharmony_ci            else:
12587db96d56Sopenharmony_ci                self.requests.pop(args, None)
12597db96d56Sopenharmony_ci                self.cache[args] = result
12607db96d56Sopenharmony_ci                if len(self.cache) > self.maxsize:
12617db96d56Sopenharmony_ci                    self.cache.popitem(0)
12627db96d56Sopenharmony_ci            return result
12637db96d56Sopenharmony_ci
12647db96d56Sopenharmony_ci.. doctest::
12657db96d56Sopenharmony_ci    :hide:
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_ci    >>> def square(x):
12687db96d56Sopenharmony_ci    ...     return x * x
12697db96d56Sopenharmony_ci    ...
12707db96d56Sopenharmony_ci    >>> f = MultiHitLRUCache(square, maxsize=4, maxrequests=6)
12717db96d56Sopenharmony_ci    >>> list(map(f, range(10)))  # First requests, don't cache
12727db96d56Sopenharmony_ci    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
12737db96d56Sopenharmony_ci    >>> f(4)  # Cache the second request
12747db96d56Sopenharmony_ci    16
12757db96d56Sopenharmony_ci    >>> f(6)  # Cache the second request
12767db96d56Sopenharmony_ci    36
12777db96d56Sopenharmony_ci    >>> f(2)  # The first request aged out, so don't cache
12787db96d56Sopenharmony_ci    4
12797db96d56Sopenharmony_ci    >>> f(6)  # Cache hit
12807db96d56Sopenharmony_ci    36
12817db96d56Sopenharmony_ci    >>> f(4)  # Cache hit and move to front
12827db96d56Sopenharmony_ci    16
12837db96d56Sopenharmony_ci    >>> list(f.cache.values())
12847db96d56Sopenharmony_ci    [36, 16]
12857db96d56Sopenharmony_ci    >>> set(f.requests).isdisjoint(f.cache)
12867db96d56Sopenharmony_ci    True
12877db96d56Sopenharmony_ci    >>> list(map(f, [9, 8, 7]))   # Cache these second requests
12887db96d56Sopenharmony_ci    [81, 64, 49]
12897db96d56Sopenharmony_ci    >>> list(map(f, [7, 9]))  # Cache hits
12907db96d56Sopenharmony_ci    [49, 81]
12917db96d56Sopenharmony_ci    >>> list(f.cache.values())
12927db96d56Sopenharmony_ci    [16, 64, 49, 81]
12937db96d56Sopenharmony_ci    >>> set(f.requests).isdisjoint(f.cache)
12947db96d56Sopenharmony_ci    True
12957db96d56Sopenharmony_ci
12967db96d56Sopenharmony_ci:class:`UserDict` objects
12977db96d56Sopenharmony_ci-------------------------
12987db96d56Sopenharmony_ci
12997db96d56Sopenharmony_ciThe class, :class:`UserDict` acts as a wrapper around dictionary objects.
13007db96d56Sopenharmony_ciThe need for this class has been partially supplanted by the ability to
13017db96d56Sopenharmony_cisubclass directly from :class:`dict`; however, this class can be easier
13027db96d56Sopenharmony_cito work with because the underlying dictionary is accessible as an
13037db96d56Sopenharmony_ciattribute.
13047db96d56Sopenharmony_ci
13057db96d56Sopenharmony_ci.. class:: UserDict([initialdata])
13067db96d56Sopenharmony_ci
13077db96d56Sopenharmony_ci    Class that simulates a dictionary.  The instance's contents are kept in a
13087db96d56Sopenharmony_ci    regular dictionary, which is accessible via the :attr:`data` attribute of
13097db96d56Sopenharmony_ci    :class:`UserDict` instances.  If *initialdata* is provided, :attr:`data` is
13107db96d56Sopenharmony_ci    initialized with its contents; note that a reference to *initialdata* will not
13117db96d56Sopenharmony_ci    be kept, allowing it to be used for other purposes.
13127db96d56Sopenharmony_ci
13137db96d56Sopenharmony_ci    In addition to supporting the methods and operations of mappings,
13147db96d56Sopenharmony_ci    :class:`UserDict` instances provide the following attribute:
13157db96d56Sopenharmony_ci
13167db96d56Sopenharmony_ci    .. attribute:: data
13177db96d56Sopenharmony_ci
13187db96d56Sopenharmony_ci        A real dictionary used to store the contents of the :class:`UserDict`
13197db96d56Sopenharmony_ci        class.
13207db96d56Sopenharmony_ci
13217db96d56Sopenharmony_ci
13227db96d56Sopenharmony_ci
13237db96d56Sopenharmony_ci:class:`UserList` objects
13247db96d56Sopenharmony_ci-------------------------
13257db96d56Sopenharmony_ci
13267db96d56Sopenharmony_ciThis class acts as a wrapper around list objects.  It is a useful base class
13277db96d56Sopenharmony_cifor your own list-like classes which can inherit from them and override
13287db96d56Sopenharmony_ciexisting methods or add new ones.  In this way, one can add new behaviors to
13297db96d56Sopenharmony_cilists.
13307db96d56Sopenharmony_ci
13317db96d56Sopenharmony_ciThe need for this class has been partially supplanted by the ability to
13327db96d56Sopenharmony_cisubclass directly from :class:`list`; however, this class can be easier
13337db96d56Sopenharmony_cito work with because the underlying list is accessible as an attribute.
13347db96d56Sopenharmony_ci
13357db96d56Sopenharmony_ci.. class:: UserList([list])
13367db96d56Sopenharmony_ci
13377db96d56Sopenharmony_ci    Class that simulates a list.  The instance's contents are kept in a regular
13387db96d56Sopenharmony_ci    list, which is accessible via the :attr:`data` attribute of :class:`UserList`
13397db96d56Sopenharmony_ci    instances.  The instance's contents are initially set to a copy of *list*,
13407db96d56Sopenharmony_ci    defaulting to the empty list ``[]``.  *list* can be any iterable, for
13417db96d56Sopenharmony_ci    example a real Python list or a :class:`UserList` object.
13427db96d56Sopenharmony_ci
13437db96d56Sopenharmony_ci    In addition to supporting the methods and operations of mutable sequences,
13447db96d56Sopenharmony_ci    :class:`UserList` instances provide the following attribute:
13457db96d56Sopenharmony_ci
13467db96d56Sopenharmony_ci    .. attribute:: data
13477db96d56Sopenharmony_ci
13487db96d56Sopenharmony_ci        A real :class:`list` object used to store the contents of the
13497db96d56Sopenharmony_ci        :class:`UserList` class.
13507db96d56Sopenharmony_ci
13517db96d56Sopenharmony_ci**Subclassing requirements:** Subclasses of :class:`UserList` are expected to
13527db96d56Sopenharmony_cioffer a constructor which can be called with either no arguments or one
13537db96d56Sopenharmony_ciargument.  List operations which return a new sequence attempt to create an
13547db96d56Sopenharmony_ciinstance of the actual implementation class.  To do so, it assumes that the
13557db96d56Sopenharmony_ciconstructor can be called with a single parameter, which is a sequence object
13567db96d56Sopenharmony_ciused as a data source.
13577db96d56Sopenharmony_ci
13587db96d56Sopenharmony_ciIf a derived class does not wish to comply with this requirement, all of the
13597db96d56Sopenharmony_cispecial methods supported by this class will need to be overridden; please
13607db96d56Sopenharmony_ciconsult the sources for information about the methods which need to be provided
13617db96d56Sopenharmony_ciin that case.
13627db96d56Sopenharmony_ci
13637db96d56Sopenharmony_ci:class:`UserString` objects
13647db96d56Sopenharmony_ci---------------------------
13657db96d56Sopenharmony_ci
13667db96d56Sopenharmony_ciThe class, :class:`UserString` acts as a wrapper around string objects.
13677db96d56Sopenharmony_ciThe need for this class has been partially supplanted by the ability to
13687db96d56Sopenharmony_cisubclass directly from :class:`str`; however, this class can be easier
13697db96d56Sopenharmony_cito work with because the underlying string is accessible as an
13707db96d56Sopenharmony_ciattribute.
13717db96d56Sopenharmony_ci
13727db96d56Sopenharmony_ci.. class:: UserString(seq)
13737db96d56Sopenharmony_ci
13747db96d56Sopenharmony_ci    Class that simulates a string object.  The instance's
13757db96d56Sopenharmony_ci    content is kept in a regular string object, which is accessible via the
13767db96d56Sopenharmony_ci    :attr:`data` attribute of :class:`UserString` instances.  The instance's
13777db96d56Sopenharmony_ci    contents are initially set to a copy of *seq*.  The *seq* argument can
13787db96d56Sopenharmony_ci    be any object which can be converted into a string using the built-in
13797db96d56Sopenharmony_ci    :func:`str` function.
13807db96d56Sopenharmony_ci
13817db96d56Sopenharmony_ci    In addition to supporting the methods and operations of strings,
13827db96d56Sopenharmony_ci    :class:`UserString` instances provide the following attribute:
13837db96d56Sopenharmony_ci
13847db96d56Sopenharmony_ci    .. attribute:: data
13857db96d56Sopenharmony_ci
13867db96d56Sopenharmony_ci        A real :class:`str` object used to store the contents of the
13877db96d56Sopenharmony_ci        :class:`UserString` class.
13887db96d56Sopenharmony_ci
13897db96d56Sopenharmony_ci    .. versionchanged:: 3.5
13907db96d56Sopenharmony_ci       New methods ``__getnewargs__``, ``__rmod__``, ``casefold``,
13917db96d56Sopenharmony_ci       ``format_map``, ``isprintable``, and ``maketrans``.
1392