Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Doc/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,6 @@
('py:attr', '__annotations__'),
('py:meth', '__missing__'),
('py:attr', '__wrapped__'),
('py:meth', 'index'), # list.index, tuple.index, etc.
]

# gh-106948: Copy standard C types declared in the "c:type" domain and C
Expand Down
4 changes: 2 additions & 2 deletions Doc/faq/design.rst
Original file line number Diff line number Diff line change
Expand Up @@ -591,9 +591,9 @@ exhaustive test suites that exercise every line of code in a module.
An appropriate testing discipline can help build large complex applications in
Python as well as having interface specifications would. In fact, it can be
better because an interface specification cannot test certain properties of a
program. For example, the :meth:`!list.append` method is expected to add new elements
program. For example, the :meth:`list.append` method is expected to add new elements
to the end of some internal list; an interface specification cannot test that
your :meth:`!list.append` implementation will actually do this correctly, but it's
your :meth:`list.append` implementation will actually do this correctly, but it's
trivial to check this property in a test suite.

Writing test suites is very helpful, and you might want to design your code to
Expand Down
8 changes: 4 additions & 4 deletions Doc/faq/programming.rst
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ There are two factors that produce this result:
(the list), and both ``x`` and ``y`` refer to it.
2) Lists are :term:`mutable`, which means that you can change their content.

After the call to :meth:`!append`, the content of the mutable object has
After the call to :meth:`~sequence.append`, the content of the mutable object has
changed from ``[]`` to ``[10]``. Since both the variables refer to the same
object, using either name accesses the modified value ``[10]``.

Expand Down Expand Up @@ -1397,9 +1397,9 @@ To see why this happens, you need to know that (a) if an object implements an
:meth:`~object.__iadd__` magic method, it gets called when the ``+=`` augmented
assignment
is executed, and its return value is what gets used in the assignment statement;
and (b) for lists, :meth:`!__iadd__` is equivalent to calling :meth:`!extend` on the list
and returning the list. That's why we say that for lists, ``+=`` is a
"shorthand" for :meth:`!list.extend`::
and (b) for lists, :meth:`!__iadd__` is equivalent to calling
:meth:`~sequence.extend` on the list and returning the list.
That's why we say that for lists, ``+=`` is a "shorthand" for :meth:`list.extend`::

>>> a_list = []
>>> a_list += [1]
Expand Down
5 changes: 3 additions & 2 deletions Doc/glossary.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1251,8 +1251,9 @@ Glossary
The :class:`collections.abc.Sequence` abstract base class
defines a much richer interface that goes beyond just
:meth:`~object.__getitem__` and :meth:`~object.__len__`, adding
:meth:`!count`, :meth:`!index`, :meth:`~object.__contains__`, and
:meth:`~object.__reversed__`. Types that implement this expanded
:meth:`~sequence.count`, :meth:`~sequence.index`,
:meth:`~object.__contains__`, and :meth:`~object.__reversed__`.
Types that implement this expanded
interface can be registered explicitly using
:func:`~abc.ABCMeta.register`. For more documentation on sequence
methods generally, see
Expand Down
4 changes: 2 additions & 2 deletions Doc/library/bisect.rst
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ The following functions are provided:
Insert *x* in *a* in sorted order.

This function first runs :py:func:`~bisect.bisect_left` to locate an insertion point.
Next, it runs the :meth:`!insert` method on *a* to insert *x* at the
Next, it runs the :meth:`~sequence.insert` method on *a* to insert *x* at the
appropriate position to maintain sort order.

To support inserting records in a table, the *key* function (if any) is
Expand All @@ -103,7 +103,7 @@ The following functions are provided:
entries of *x*.

This function first runs :py:func:`~bisect.bisect_right` to locate an insertion point.
Next, it runs the :meth:`!insert` method on *a* to insert *x* at the
Next, it runs the :meth:`~sequence.insert` method on *a* to insert *x* at the
appropriate position to maintain sort order.

To support inserting records in a table, the *key* function (if any) is
Expand Down
9 changes: 5 additions & 4 deletions Doc/library/collections.abc.rst
Original file line number Diff line number Diff line change
Expand Up @@ -264,8 +264,9 @@ Collections Abstract Base Classes -- Detailed Descriptions
ABCs for read-only and mutable :term:`sequences <sequence>`.

Implementation note: Some of the mixin methods, such as
:meth:`~container.__iter__`, :meth:`~object.__reversed__` and :meth:`index`, make
repeated calls to the underlying :meth:`~object.__getitem__` method.
:meth:`~container.__iter__`, :meth:`~object.__reversed__`,
and :meth:`~sequence.index` make repeated calls to the underlying
:meth:`~object.__getitem__` method.
Consequently, if :meth:`~object.__getitem__` is implemented with constant
access speed, the mixin methods will have linear performance;
however, if the underlying method is linear (as it would be with a
Expand All @@ -281,8 +282,8 @@ Collections Abstract Base Classes -- Detailed Descriptions
Supporting the *start* and *stop* arguments is optional, but recommended.

.. versionchanged:: 3.5
The :meth:`!index` method added support for *stop* and *start*
arguments.
The :meth:`~sequence.index` method gained support for
the *stop* and *start* arguments.

.. class:: Set
MutableSet
Expand Down
4 changes: 2 additions & 2 deletions Doc/library/collections.rst
Original file line number Diff line number Diff line change
Expand Up @@ -783,10 +783,10 @@ sequence of key-value pairs into a dictionary of lists:

When each key is encountered for the first time, it is not already in the
mapping; so an entry is automatically created using the :attr:`~defaultdict.default_factory`
function which returns an empty :class:`list`. The :meth:`!list.append`
function which returns an empty :class:`list`. The :meth:`list.append`
operation then attaches the value to the new list. When keys are encountered
again, the look-up proceeds normally (returning the list for that key) and the
:meth:`!list.append` operation adds another value to the list. This technique is
:meth:`list.append` operation adds another value to the list. This technique is
simpler and faster than an equivalent technique using :meth:`dict.setdefault`:

>>> d = {}
Expand Down
4 changes: 2 additions & 2 deletions Doc/library/pickle.rst
Original file line number Diff line number Diff line change
Expand Up @@ -732,8 +732,8 @@ or both.
These items will be appended to the object either using
``obj.append(item)`` or, in batch, using ``obj.extend(list_of_items)``.
This is primarily used for list subclasses, but may be used by other
classes as long as they have
:ref:`append and extend methods <typesseq-common>` with
classes as long as they have :meth:`~sequence.append`
and :meth:`~sequence.extend` methods with
the appropriate signature. (Whether :meth:`!append` or :meth:`!extend` is
used depends on which pickle protocol version is used as well as the number
of items to append, so both must be supported.)
Expand Down
212 changes: 135 additions & 77 deletions Doc/library/stdtypes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1000,8 +1000,6 @@ operations have the same priority as the corresponding numeric operations. [3]_
pair: slice; operation
pair: operator; in
pair: operator; not in
single: count() (sequence method)
single: index() (sequence method)

+--------------------------+--------------------------------+----------+
| Operation | Result | Notes |
Expand All @@ -1018,7 +1016,7 @@ operations have the same priority as the corresponding numeric operations. [3]_
| ``s * n`` or | equivalent to adding *s* to | (2)(7) |
| ``n * s`` | itself *n* times | |
+--------------------------+--------------------------------+----------+
| ``s[i]`` | *i*\ th item of *s*, origin 0 | (3)(9) |
| ``s[i]`` | *i*\ th item of *s*, origin 0 | (3)(8) |
+--------------------------+--------------------------------+----------+
| ``s[i:j]`` | slice of *s* from *i* to *j* | (3)(4) |
+--------------------------+--------------------------------+----------+
Expand All @@ -1031,13 +1029,6 @@ operations have the same priority as the corresponding numeric operations. [3]_
+--------------------------+--------------------------------+----------+
| ``max(s)`` | largest item of *s* | |
+--------------------------+--------------------------------+----------+
| ``s.index(x[, i[, j]])`` | index of the first occurrence | \(8) |
| | of *x* in *s* (at or after | |
| | index *i* and before index *j*)| |
+--------------------------+--------------------------------+----------+
| ``s.count(x)`` | total number of occurrences of | |
| | *x* in *s* | |
+--------------------------+--------------------------------+----------+

Sequences of the same type also support comparisons. In particular, tuples
and lists are compared lexicographically by comparing corresponding elements.
Expand Down Expand Up @@ -1143,16 +1134,42 @@ Notes:
concatenation or repetition.

(8)
``index`` raises :exc:`ValueError` when *x* is not found in *s*.
Not all implementations support passing the additional arguments *i* and *j*.
These arguments allow efficient searching of subsections of the sequence. Passing
the extra arguments is roughly equivalent to using ``s[i:j].index(x)``, only
without copying any data and with the returned index being relative to
the start of the sequence rather than the start of the slice.

(9)
An :exc:`IndexError` is raised if *i* is outside the sequence range.

.. rubric:: Sequence Methods

Sequence types also support the following methods:

.. method:: list.count(value, /)
range.count(value, /)
tuple.count(value, /)
:no-contents-entry:
:no-index-entry:
:no-typesetting:
.. method:: sequence.count(value, /)

Return the total number of occurrences of *value* in *sequence*.

.. method:: list.index(value[, start[, stop])
range.index(value[, start[, stop])
tuple.index(value[, start[, stop])
:no-contents-entry:
:no-index-entry:
:no-typesetting:
.. method:: sequence.index(value[, start[, stop])

Return the index of the first occurrence of *value* in *sequence*.

Raises :exc:`ValueError` if *value* is not found in *sequence*.

The *start* or *stop* arguments allow for efficient searching
of subsections of the sequence, beginning at *start* and ending at *stop*.
This is roughly equivalent to ``start + sequence[start:stop].index(value)``,
only without copying any data.

.. caution::
Not all sequence types support passing the *start* and *stop* arguments.


.. _typesseq-immutable:

Expand Down Expand Up @@ -1202,14 +1219,6 @@ accepts integers that meet the value restriction ``0 <= x <= 255``).
pair: subscript; assignment
pair: slice; assignment
pair: statement; del
single: append() (sequence method)
single: clear() (sequence method)
single: copy() (sequence method)
single: extend() (sequence method)
single: insert() (sequence method)
single: pop() (sequence method)
single: remove() (sequence method)
single: reverse() (sequence method)

+------------------------------+--------------------------------+---------------------+
| Operation | Result | Notes |
Expand All @@ -1233,72 +1242,120 @@ accepts integers that meet the value restriction ``0 <= x <= 255``).
| ``del s[i:j:k]`` | removes the elements of | |
| | ``s[i:j:k]`` from the list | |
+------------------------------+--------------------------------+---------------------+
| ``s.append(x)`` | appends *x* to the end of the | |
| | sequence (same as | |
| | ``s[len(s):len(s)] = [x]``) | |
+------------------------------+--------------------------------+---------------------+
| ``s.clear()`` | removes all items from *s* | \(5) |
| | (same as ``del s[:]``) | |
+------------------------------+--------------------------------+---------------------+
| ``s.copy()`` | creates a shallow copy of *s* | \(5) |
| | (same as ``s[:]``) | |
+------------------------------+--------------------------------+---------------------+
| ``s.extend(t)`` or | extends *s* with the | |
| ``s += t`` | contents of *t* (for the | |
| ``s += t`` | extends *s* with the | |
| | contents of *t* (for the | |
| | most part the same as | |
| | ``s[len(s):len(s)] = t``) | |
+------------------------------+--------------------------------+---------------------+
| ``s *= n`` | updates *s* with its contents | \(6) |
| ``s *= n`` | updates *s* with its contents | \(2) |
| | repeated *n* times | |
+------------------------------+--------------------------------+---------------------+
| ``s.insert(i, x)`` | inserts *x* into *s* at the | |
| | index given by *i* | |
| | (same as ``s[i:i] = [x]``) | |
+------------------------------+--------------------------------+---------------------+
| ``s.pop()`` or ``s.pop(i)`` | retrieves the item at *i* and | \(2) |
| | also removes it from *s* | |
+------------------------------+--------------------------------+---------------------+
| ``s.remove(x)`` | removes the first item from | \(3) |
| | *s* where ``s[i]`` is equal to | |
| | *x* | |
+------------------------------+--------------------------------+---------------------+
| ``s.reverse()`` | reverses the items of *s* in | \(4) |
| | place | |
+------------------------------+--------------------------------+---------------------+


Notes:

(1)
If *k* is not equal to ``1``, *t* must have the same length as the slice it is replacing.

(2)
The optional argument *i* defaults to ``-1``, so that by default the last
item is removed and returned.
The value *n* is an integer, or an object implementing
:meth:`~object.__index__`. Zero and negative values of *n* clear
the sequence. Items in the sequence are not copied; they are referenced
multiple times, as explained for ``s * n`` under :ref:`typesseq-common`.

(3)
:meth:`remove` raises :exc:`ValueError` when *x* is not found in *s*.
.. rubric:: Mutable Sequence Methods

(4)
The :meth:`reverse` method modifies the sequence in place for economy of
space when reversing a large sequence. To remind users that it operates by
side effect, it does not return the reversed sequence.
Mutable sequence types also support the following methods:

(5)
:meth:`clear` and :meth:`!copy` are included for consistency with the
interfaces of mutable containers that don't support slicing operations
(such as :class:`dict` and :class:`set`). :meth:`!copy` is not part of the
:class:`collections.abc.MutableSequence` ABC, but most concrete
mutable sequence classes provide it.
.. method:: bytearray.append(value, /)
list.append(value, /)
:no-contents-entry:
:no-index-entry:
:no-typesetting:
.. method:: sequence.append(value, /)

Append *value* to the end of the sequence
This is equivalent to writing ``seq[len(seq):len(seq)] = [value]``.

.. method:: bytearray.clear()
list.clear()
:no-contents-entry:
:no-index-entry:
:no-typesetting:
.. method:: sequence.clear()

.. versionadded:: 3.3
:meth:`clear` and :meth:`!copy` methods.

(6)
The value *n* is an integer, or an object implementing
:meth:`~object.__index__`. Zero and negative values of *n* clear
the sequence. Items in the sequence are not copied; they are referenced
multiple times, as explained for ``s * n`` under :ref:`typesseq-common`.
Remove all items from *sequence*.
This is equivalent to writing ``del sequence[:]``.

.. method:: bytearray.copy()
list.copy()
:no-contents-entry:
:no-index-entry:
:no-typesetting:
.. method:: sequence.copy()

.. versionadded:: 3.3

Create a shallow copy of *sequence*.
This is equivalent to writing ``sequence[:]``.

.. hint:: The :meth:`!copy` method is not part of the
:class:`~collections.abc.MutableSequence` :class:`~abc.ABC`,
but most concrete mutable sequence types provide it.

.. method:: bytearray.extend(iterable, /)
list.extend(iterable, /)
:no-contents-entry:
:no-index-entry:
:no-typesetting:
.. method:: sequence.extend(iterable, /)

Extend *sequence* with the contents of *iterable*.
For the most part, this is the same as writing
``seq[len(seq):len(seq)] = iterable``.

.. method:: bytearray.insert(index, value, /)
list.insert(index, value, /)
:no-contents-entry:
:no-index-entry:
:no-typesetting:
.. method:: sequence.insert(index, value, /)

Insert *value* into *sequence* at the given *index*.
This is equivalent to writing ``sequence[index:index] = [value]``.

.. method:: bytearray.pop(index=-1, /)
list.pop(index=-1, /)
:no-contents-entry:
:no-index-entry:
:no-typesetting:
.. method:: sequence.pop(index=-1, /)

Retrieve the item at *index* and also removes it from *sequence*.
By default, the last item in *sequence* is removed and returned.

.. method:: bytearray.remove(value, /)
list.remove(value, /)
:no-contents-entry:
:no-index-entry:
:no-typesetting:
.. method:: sequence.remove(value, /)

Remove the first item from *sequence* where ``sequence[i] == value``.

Raises :exc:`ValueError` if *value* is not found in *sequence*.

.. method:: bytearray.reverse()
list.reverse()
:no-contents-entry:
:no-index-entry:
:no-typesetting:
.. method:: sequence.reverse()

Reverse the items of *sequence* in place.
This method maintains economy of space when reversing a large sequence.
To remind users that it operates by side-effect, it returns ``None``.


.. _typesseq-list:
Expand Down Expand Up @@ -5761,9 +5818,10 @@ Methods

.. index:: pair: object; method

Methods are functions that are called using the attribute notation. There are
two flavors: :ref:`built-in methods <builtin-methods>` (such as :meth:`append`
on lists) and :ref:`class instance method <instance-methods>`.
Methods are functions that are called using the attribute notation.
There are two flavors: :ref:`built-in methods <builtin-methods>`
(such as :meth:`~list.append` on lists)
and :ref:`class instance method <instance-methods>`.
Built-in methods are described with the types that support them.

If you access a method (a function defined in a class namespace) through an
Expand Down
Loading
Loading