Skip to content

Commit 343719d

Browse files
authored
gh-135646: Raise consistent NameError exceptions in ForwardRef.evaluate() (#135663)
1 parent 9877d19 commit 343719d

File tree

3 files changed

+8
-2
lines changed

3 files changed

+8
-2
lines changed

Lib/annotationlib.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ class Format(enum.IntEnum):
2727

2828

2929
_sentinel = object()
30+
# Following `NAME_ERROR_MSG` in `ceval_macros.h`:
31+
_NAME_ERROR_MSG = "name '{name:.200}' is not defined"
32+
3033

3134
# Slots shared by ForwardRef and _Stringifier. The __forward__ names must be
3235
# preserved for compatibility with the old typing.ForwardRef class. The remaining
@@ -184,7 +187,7 @@ def evaluate(
184187
elif is_forwardref_format:
185188
return self
186189
else:
187-
raise NameError(arg)
190+
raise NameError(_NAME_ERROR_MSG.format(name=arg), name=arg)
188191
else:
189192
code = self.__forward_code__
190193
try:

Lib/test/test_annotationlib.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1650,9 +1650,11 @@ def test_name_lookup_without_eval(self):
16501650
with support.swap_attr(builtins, "int", dict):
16511651
self.assertIs(ForwardRef("int").evaluate(), dict)
16521652

1653-
with self.assertRaises(NameError):
1653+
with self.assertRaises(NameError, msg="name 'doesntexist' is not defined") as exc:
16541654
ForwardRef("doesntexist").evaluate()
16551655

1656+
self.assertEqual(exc.exception.name, "doesntexist")
1657+
16561658
def test_fwdref_invalid_syntax(self):
16571659
fr = ForwardRef("if")
16581660
with self.assertRaises(SyntaxError):
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Raise consistent :exc:`NameError` exceptions in :func:`annotationlib.ForwardRef.evaluate`

0 commit comments

Comments
 (0)