summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJelle Zijlstra <jelle.zijlstra@gmail.com>2025-04-15 17:14:27 (GMT)
committerGitHub <noreply@github.com>2025-04-15 17:14:27 (GMT)
commit666eeda13d319aa82b151eef3e3c55a48d90a052 (patch)
tree7ae8857cde0fa13b86e1f4d101d8d6f731e60b37
parent818b6a9eadb7c606bc3faab91de4a76bde66a9ae (diff)
downloadcpython-666eeda13d319aa82b151eef3e3c55a48d90a052.zip
cpython-666eeda13d319aa82b151eef3e3c55a48d90a052.tar.gz
cpython-666eeda13d319aa82b151eef3e3c55a48d90a052.tar.bz2
gh-132493: Support deferred annotations in Protocols (#132494)
-rw-r--r--Lib/test/test_typing.py9
-rw-r--r--Lib/typing.py4
-rw-r--r--Misc/NEWS.d/next/Library/2025-04-13-21-35-50.gh-issue-132493.5SAQJn.rst2
3 files changed, 14 insertions, 1 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 9f9e3eb..fc89380 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -4554,6 +4554,15 @@ class ProtocolTests(BaseTestCase):
)
self.assertIs(type(exc.__cause__), CustomError)
+ def test_deferred_evaluation_of_annotations(self):
+ class DeferredProto(Protocol):
+ x: DoesNotExist
+ self.assertEqual(get_protocol_members(DeferredProto), {"x"})
+ self.assertEqual(
+ annotationlib.get_annotations(DeferredProto, format=annotationlib.Format.STRING),
+ {'x': 'DoesNotExist'}
+ )
+
class GenericTests(BaseTestCase):
diff --git a/Lib/typing.py b/Lib/typing.py
index e5d14b0..08b2ba3 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -1801,7 +1801,9 @@ def _get_protocol_attrs(cls):
for base in cls.__mro__[:-1]: # without object
if base.__name__ in {'Protocol', 'Generic'}:
continue
- annotations = getattr(base, '__annotations__', {})
+ annotations = _lazy_annotationlib.get_annotations(
+ base, format=_lazy_annotationlib.Format.FORWARDREF
+ )
for attr in (*base.__dict__, *annotations):
if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
attrs.add(attr)
diff --git a/Misc/NEWS.d/next/Library/2025-04-13-21-35-50.gh-issue-132493.5SAQJn.rst b/Misc/NEWS.d/next/Library/2025-04-13-21-35-50.gh-issue-132493.5SAQJn.rst
new file mode 100644
index 0000000..bda09e2
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-04-13-21-35-50.gh-issue-132493.5SAQJn.rst
@@ -0,0 +1,2 @@
+Support creation of :class:`typing.Protocol` classes with annotations that
+cannot be resolved at class creation time.