gh-138372: Fix SyntaxWarning for erroneous t-string subscription (#138375)

This commit is contained in:
Brian Schubert
2025-09-02 13:13:12 -04:00
committed by GitHub
parent b3e785c76c
commit 5493b46462
3 changed files with 12 additions and 7 deletions

View File

@@ -1554,6 +1554,8 @@ class GrammarTests(unittest.TestCase):
check('[None [i, j]]')
check('[True [i, j]]')
check('[... [i, j]]')
check('[t"{x}" [i, j]]')
check('[t"x={x}" [i, j]]')
msg=r'indices must be integers or slices, not tuple; perhaps you missed a comma\?'
check('[(1, 2) [i, j]]')
@@ -1564,8 +1566,6 @@ class GrammarTests(unittest.TestCase):
check('[f"x={x}" [i, j]]')
check('["abc" [i, j]]')
check('[b"abc" [i, j]]')
check('[t"{x}" [i, j]]')
check('[t"x={x}" [i, j]]')
msg=r'indices must be integers or slices, not tuple;'
check('[[1, 2] [3, 4]]')
@@ -1586,6 +1586,7 @@ class GrammarTests(unittest.TestCase):
check('[[1, 2] [f"{x}"]]')
check('[[1, 2] [f"x={x}"]]')
check('[[1, 2] ["abc"]]')
msg=r'indices must be integers or slices, not string.templatelib.Template;'
check('[[1, 2] [t"{x}"]]')
check('[[1, 2] [t"x={x}"]]')
msg=r'indices must be integers or slices, not'

View File

@@ -0,0 +1,2 @@
Fix :exc:`SyntaxWarning` emitted for erroneous subscript expressions involving
:ref:`template string literals <t-strings>`. Patch by Brian Schubert.

View File

@@ -29,6 +29,7 @@
#include "pycore_symtable.h" // PySTEntryObject
#include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString
#include "pycore_ceval.h" // SPECIAL___ENTER__
#include "pycore_template.h" // _PyTemplate_Type
#define NEED_OPCODE_METADATA
#include "pycore_opcode_metadata.h" // _PyOpcode_opcode_metadata, _PyOpcode_num_popped/pushed
@@ -3617,10 +3618,11 @@ infer_type(expr_ty e)
return &PyGen_Type;
case Lambda_kind:
return &PyFunction_Type;
case JoinedStr_kind:
case TemplateStr_kind:
case FormattedValue_kind:
case Interpolation_kind:
return &_PyTemplate_Type;
case JoinedStr_kind:
case FormattedValue_kind:
return &PyUnicode_Type;
case Constant_kind:
return Py_TYPE(e->v.Constant.value);
@@ -3674,6 +3676,8 @@ check_subscripter(compiler *c, expr_ty e)
case Set_kind:
case SetComp_kind:
case GeneratorExp_kind:
case TemplateStr_kind:
case Interpolation_kind:
case Lambda_kind: {
location loc = LOC(e);
return _PyCompile_Warn(c, loc, "'%.200s' object is not subscriptable; "
@@ -3708,9 +3712,7 @@ check_index(compiler *c, expr_ty e, expr_ty s)
case List_kind:
case ListComp_kind:
case JoinedStr_kind:
case TemplateStr_kind:
case FormattedValue_kind:
case Interpolation_kind: {
case FormattedValue_kind: {
location loc = LOC(e);
return _PyCompile_Warn(c, loc, "%.200s indices must be integers "
"or slices, not %.200s; "