[Python-checkins] [3.12] Clarify `Self` interaction with subclasses (GH-107511) (#107548)
Yhg1s
webhook-mailer at python.org
Tue Aug 1 19:52:32 EDT 2023
https://github.com/python/cpython/commit/f7e16d74adffb8bc890530caebf0a08a6ea89d36
commit: f7e16d74adffb8bc890530caebf0a08a6ea89d36
branch: 3.12
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: Yhg1s <thomas at python.org>
date: 2023-08-02T01:52:28+02:00
summary:
[3.12] Clarify `Self` interaction with subclasses (GH-107511) (#107548)
Clarify `Self` interaction with subclasses (GH-107511)
(cherry picked from commit c8872f4285d3b61c252e3384bec6d30618b7d698)
Co-authored-by: Alexandru Mărășteanu <alexei at users.noreply.github.com>
files:
M Doc/library/typing.rst
diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst
index 60bf06e471cb2..d060066c0cdea 100644
--- a/Doc/library/typing.rst
+++ b/Doc/library/typing.rst
@@ -953,13 +953,17 @@ using ``[]``.
For example::
- from typing import Self
+ from typing import Self, reveal_type
class Foo:
def return_self(self) -> Self:
...
return self
+ class SubclassOfFoo(Foo): pass
+
+ reveal_type(Foo().return_self()) # Revealed type is "Foo"
+ reveal_type(SubclassOfFoo().return_self()) # Revealed type is "SubclassOfFoo"
This annotation is semantically equivalent to the following,
albeit in a more succinct fashion::
@@ -973,15 +977,11 @@ using ``[]``.
...
return self
- In general if something currently follows the pattern of::
-
- class Foo:
- def return_self(self) -> "Foo":
- ...
- return self
-
- You should use :data:`Self` as calls to ``SubclassOfFoo.return_self`` would have
- ``Foo`` as the return type and not ``SubclassOfFoo``.
+ In general, if something returns ``self``, as in the above examples, you
+ should use ``Self`` as the return annotation. If ``Foo.return_self`` was
+ annotated as returning ``"Foo"``, then the type checker would infer the
+ object returned from ``SubclassOfFoo.return_self`` as being of type ``Foo``
+ rather than ``SubclassOfFoo``.
Other common use cases include:
@@ -989,6 +989,17 @@ using ``[]``.
of the ``cls`` parameter.
- Annotating an :meth:`~object.__enter__` method which returns self.
+ You should not use ``Self`` as the return annotation if the method is not
+ guaranteed to return an instance of a subclass when the class is
+ subclassed::
+
+ class Eggs:
+ # Self would be an incorrect return annotation here,
+ # as the object returned is always an instance of Eggs,
+ # even in subclasses
+ def returns_eggs(self) -> "Eggs":
+ return Eggs()
+
See :pep:`673` for more details.
.. versionadded:: 3.11
More information about the Python-checkins
mailing list