Skip to content

gh-135676: Reword the Operators & Delimiters section(s) #137713

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from
Draft
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
110 changes: 53 additions & 57 deletions Doc/reference/lexical_analysis.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1351,67 +1351,63 @@ Formally, imaginary literals are described by the following lexical definition:
imagnumber: (`floatnumber` | `digitpart`) ("j" | "J")


.. _operators:

Operators
=========

.. index:: single: operators

The following tokens are operators:

.. code-block:: none


+ - * ** / // % @
<< >> & | ^ ~ :=
< > <= >= == !=


.. _delimiters:

Delimiters
==========

.. index:: single: delimiters

The following tokens serve as delimiters in the grammar:

.. code-block:: none

( ) [ ] { }
, : ! . ; @ =

The period can also occur in floating-point and imaginary literals.

.. _operators:
.. _lexical-ellipsis:

A sequence of three periods has a special meaning as an
:py:data:`Ellipsis` literal:

.. code-block:: none

...

The following *augmented assignment operators* serve
lexically as delimiters, but also perform an operation:

.. code-block:: none
Operators and delimiters
========================

-> += -= *= /= //= %=
@= &= |= ^= >>= <<= **=

The following printing ASCII characters have special meaning as part of other
tokens or are otherwise significant to the lexical analyzer:

.. code-block:: none

' " # \

The following printing ASCII characters are not used in Python. Their
occurrence outside string literals and comments is an unconditional error:
.. index::
single: operators
single: delimiters

.. code-block:: none
The following grammar defines :dfn:`operator` and :dfn:`delimiter` tokens,
that is, the generic :data:`~token.OP` token type:

$ ? `
.. grammar-snippet::
:group: python-grammar

OP:
| arithmetic_operator
| bitwise_operator
| comparison_operator
| enclosing_delimiter
| other_delimiter
| assignment_operator
| other_op
| "..."

arithmetic_operator: "+" | "-" | "*" | "**" | "/" | "//" | "%"
bitwise_operator: "&" | "^" | "~" | "<<" | ">>"
assignment_operator: "+=" | "-=" | "*=" | "**=" | "/=" | "//=" | "%=" |
"&=" | "|=" | "^=" | "<<=" | ">>=" | "@=" | ":="
comparison_operator: "<" | ">" | "<=" | ">=" | "==" | "!="
enclosing_delimiter: "(" | ")" | "[" | "]" | "{" | "}"
other_delimiter: "," | ":" | "!" | ";" | "=" | "->"
other_op: "." | "@"

.. note::

Generally, *operators* are used to combine :ref:`expressions <expressions>`,
while *delimiters* serve other purposes.
However, there is no clear, formal distinction between the two categories.

Some tokens can serve as either operators or delimiters, depending on usage.
For example, ``*`` is both the multiplication operator and a delimiter used
for sequence unpacking, and ``@`` is both the matrix multiplication and
a delimiter that introduces decorators.

For some tokens, the distinction is unclear.
For example, some people consider ``. ( )`` to be delimiters, while others
see the :py:func:`getattr` operator and the function call operator(s).

Some of Python's operators, like ``and``, ``or``, and ``not in``, use
:ref:`keyword <keywords>` tokens rather than "symbols" (operator tokens).

A sequence of three consecutive periods (``...``) has a special
meaning as an :py:data:`Ellipsis` literal.

See :ref:`operator and delimiter tokens <token_operators_delimiters>`
in the :mod:`!token` module documentation for names of the operator and
delimiter tokens.
Loading