funcdef: [`decorators`] "def" `funcname` "(" [`parameter_list`] ")"
: ["->" `expression`] ":" `suite`
decorators: `decorator`+
- decorator: "@" `dotted_name` ["(" [`argument_list` [","]] ")"] NEWLINE
+ decorator: "@" `assignment_expression` NEWLINE
dotted_name: `identifier` ("." `identifier`)*
parameter_list: `defparameter` ("," `defparameter`)* "," "/" ["," [`parameter_list_no_posonly`]]
: | `parameter_list_no_posonly`
except that the original function is not temporarily bound to the name ``func``.
+.. versionchanged:: 3.9
+ Functions may be decorated with any valid :token:`assignment_expression`.
+ Previously, the grammar was much more restrictive; see :pep:`614` for
+ details.
+
.. index::
triple: default; parameter; value
single: argument; function definition
The evaluation rules for the decorator expressions are the same as for function
decorators. The result is then bound to the class name.
+.. versionchanged:: 3.9
+ Classes may be decorated with any valid :token:`assignment_expression`.
+ Previously, the grammar was much more restrictive; see :pep:`614` for
+ details.
+
**Programmer's note:** Variables defined in the class definition are class
attributes; they are shared by instances. Instance attributes can be set in a
method with ``self.name = value``. Both class and instance attributes are
There are similar changes for :class:`bytes` and :class:`bytearray` objects.
(Contributed by Serhiy Storchaka in :issue:`28029`.)
+* Any valid expression can now be used as a :term:`decorator`. Previously, the
+ grammar was much more restrictive. See :pep:`614` for details.
+ (Contributed by Brandt Bucher in :issue:`39702`.)
+
New Modules
===========