gh-116325: Raise `SyntaxError` rather than `IndexError` on ForwardRef with empty string arg (GH-116341)
(cherry picked from commit
a29998a06bf75264c3faaeeec4584a5f75b45a1f)
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
with self.assertRaises(SyntaxError):
get_type_hints(foo)
+ def test_syntax_error_empty_string(self):
+ for form in [typing.List, typing.Set, typing.Type, typing.Deque]:
+ with self.subTest(form=form):
+ with self.assertRaises(SyntaxError):
+ form['']
+
def test_name_error(self):
def foo(a: 'Noode[T]'):
# If we do `def f(*args: *Ts)`, then we'll have `arg = '*Ts'`.
# Unfortunately, this isn't a valid expression on its own, so we
# do the unpacking manually.
- if arg[0] == '*':
+ if arg.startswith('*'):
arg_to_compile = f'({arg},)[0]' # E.g. (*Ts,)[0] or (*tuple[int, int],)[0]
else:
arg_to_compile = arg
--- /dev/null
+:mod:`typing`: raise :exc:`SyntaxError` instead of :exc:`AttributeError`
+on forward references as empty strings.