@@ -30,9 +30,11 @@ specification:
3030 that can be run in a "fake globals" environment. Instead, we add a fourth format,
3131 ``VALUE_WITH_FAKE_GLOBALS ``, to allow third-party implementors of annotate functions to
3232 indicate what formats they support.
33- * Setting the ``__annotations__ `` attribute directly will not affect the ``__annotate__ `` attribute .
33+ * Deleting the ``__annotations__ `` attribute directly will also clear ``__annotate__ ``.
3434* We add functionality to allow evaluating type alias values and type parameter bounds and defaults
3535 (which were added by :pep: `695 ` and :pep: `696 `) using PEP 649-like semantics.
36+ * The ``SOURCE `` format is renamed to ``STRING `` to improve clarity and reduce the risk of
37+ user confusion.
3638
3739Motivation
3840==========
@@ -229,13 +231,13 @@ The module will contain the following functionality:
229231 dictionary. This is intended to be used for evaluating deferred attributes introduced by
230232 :pep: `695 ` and :pep: `696 `; see below for details. *func * may be ``None ``
231233 for convenience; if ``None `` is passed, the function also returns ``None ``.
232- * ``annotations_to_source (annotations: dict[str, object]) -> dict[str, str] ``: a function that
234+ * ``annotations_to_string (annotations: dict[str, object]) -> dict[str, str] ``: a function that
233235 converts each value in an annotations dictionary to a string representation.
234236 This is useful for
235237 implementing the ``SOURCE `` format in cases where the original source is not available,
236238 such as in the functional syntax for :py:class: `typing.TypedDict `.
237- * ``value_to_source (value: object) -> str ``: a function that converts a single value to a
238- string representation. This is used by ``annotations_to_source ``.
239+ * ``value_to_string (value: object) -> str ``: a function that converts a single value to a
240+ string representation. This is used by ``annotations_to_string ``.
239241 It uses ``repr() `` for most values, but for types it returns the fully qualified name.
240242 It is also useful as a helper for the ``repr() `` of a number of objects in the
241243 :py:mod: `typing ` and :py:mod: `collections.abc ` modules.
@@ -629,29 +631,23 @@ Third-party code that implements ``__annotate__`` functions should raise
629631and the function is not prepared to be run in a "fake globals" environment.
630632This should be mentioned in the data model documentation for ``__annotate__ ``.
631633
632- Effect of setting ``__annotations__ ``
633- =====================================
634+ Effect of deleting ``__annotations__ ``
635+ ======================================
634636
635637:pep: `649 ` specifies:
636638
637639 Setting ``o.__annotations__ `` to a legal value
638640 automatically sets ``o.__annotate__ `` to ``None ``.
639641
640- We would prefer to keep ``__annotate__ `` unchanged when ``__annotations__ ``
641- is written to. Conceptually, ``__annotate__ `` provides the ground truth
642- and ``__annotations__ `` is merely a cache, and we shouldn't throw away the
643- ground truth if the cache is modified.
644-
645- The motivation for :pep: `649 `'s behavior is to keep the two attributes in sync.
646- However, this is impossible in general; if the ``__annotations__ `` dictionary
647- is modified in place, this will not be reflected in the ``__annotate__ `` attribute.
648- The overall mental model for this area will be simpler if setting ``__annotations__ ``
649- has no effect on ``__annotate__ ``.
642+ However, the PEP does not say what happens if the ``__annotations__ `` attribute
643+ is deleted (using ``del ``). It seems most consistent that deleting the attribute
644+ will also delete ``__annotate__ ``.
650645
651646Specification
652647-------------
653648
654- The value of ``__annotate__ `` is not changed when ``__annotations__ `` is set.
649+ Deleting the ``__annotations__ `` attribute on functions, modules, and classes
650+ results in setting ``__annotate__ `` to None.
655651
656652Deferred evaluation of PEP 695 and 696 objects
657653==============================================
@@ -730,6 +726,34 @@ can use the ``ForwardRef.evaluate`` method.
730726If use cases come up in the future, we could add additional functionality,
731727such as a new method that re-evaluates the annotation from scratch.
732728
729+ Renaming ``SOURCE `` to ``STRING ``
730+ =================================
731+
732+ The ``SOURCE `` format is meant for tools that need to show a human-readable
733+ format that is close to the original source code. However, we cannot retrieve
734+ the original source in ``__annotate__ `` functions, and in some cases, we have
735+ ``__annotate__ `` functions in Python code that do not have access to the original
736+ code. For example, this applies to :py:func: `dataclasses.make_dataclass `
737+ and the call-based syntax for :py:class: `typing.TypedDict `.
738+
739+ This makes the name ``SOURCE `` a bit of a misnomer. The goal of the format
740+ should indeed be to recreate the source, but the name is likely to mislead
741+ users in practice. A more neutral name would emphasize that the format returns
742+ an annotation dictionary with only strings. We suggest ``STRING ``.
743+
744+ Specification
745+ -------------
746+
747+ The ``SOURCE `` format is renamed to ``STRING ``. To reiterate the changes in this
748+ PEP, the four supported formats are now:
749+
750+ - ``VALUE ``: the default format, which evaluates the annotations and returns the
751+ resulting values.
752+ - ``VALUE_WITH_FAKE_GLOBALS ``: for internal use; should be handled like ``VALUE ``
753+ by annotate functions that support execution with fake globals.
754+ - ``FORWARDREF ``: replaces undefined names with ``ForwardRef `` objects.
755+ - ``STRING ``: returns strings, attempts to recreate code close to the original source.
756+
733757Miscellaneous implementation details
734758====================================
735759
0 commit comments