gh-133581: Improve AST unparsing of t-strings (#133635)

This commit is contained in:
Jelle Zijlstra 2025-05-08 06:13:57 -07:00 committed by GitHub
parent a2c4467d06
commit bfac7d2edc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 55 additions and 20 deletions

View file

@ -702,6 +702,13 @@ append_templatestr(PyUnicodeWriter *writer, expr_ty e)
Py_ssize_t last_idx = 0;
Py_ssize_t len = asdl_seq_LEN(e->v.TemplateStr.values);
if (len == 0) {
int result = _write_values_subarray(writer, e->v.TemplateStr.values,
0, len - 1, 't', arena);
_PyArena_Free(arena);
return result;
}
for (Py_ssize_t i = 0; i < len; i++) {
expr_ty value = asdl_seq_GET(e->v.TemplateStr.values, i);
@ -774,30 +781,35 @@ append_joinedstr(PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
}
static int
append_interpolation_value(PyUnicodeWriter *writer, expr_ty e)
append_interpolation_str(PyUnicodeWriter *writer, PyObject *str)
{
const char *outer_brace = "{";
if (PyUnicode_Find(str, _Py_LATIN1_CHR('{'), 0, 1, 1) == 0) {
/* Expression starts with a brace, split it with a space from the outer
one. */
outer_brace = "{ ";
}
if (-1 == append_charp(writer, outer_brace)) {
return -1;
}
if (-1 == PyUnicodeWriter_WriteStr(writer, str)) {
return -1;
}
return 0;
}
static int
append_interpolation_value(PyUnicodeWriter *writer, expr_ty e)
{
/* Grammar allows PR_TUPLE, but use >PR_TEST for adding parenthesis
around a lambda with ':' */
PyObject *temp_fv_str = expr_as_unicode(e, PR_TEST + 1);
if (!temp_fv_str) {
return -1;
}
if (PyUnicode_Find(temp_fv_str, _Py_LATIN1_CHR('{'), 0, 1, 1) == 0) {
/* Expression starts with a brace, split it with a space from the outer
one. */
outer_brace = "{ ";
}
if (-1 == append_charp(writer, outer_brace)) {
Py_DECREF(temp_fv_str);
return -1;
}
if (-1 == PyUnicodeWriter_WriteStr(writer, temp_fv_str)) {
Py_DECREF(temp_fv_str);
return -1;
}
int result = append_interpolation_str(writer, temp_fv_str);
Py_DECREF(temp_fv_str);
return 0;
return result;
}
static int
@ -843,7 +855,7 @@ append_interpolation_format_spec(PyUnicodeWriter *writer, expr_ty e)
static int
append_interpolation(PyUnicodeWriter *writer, expr_ty e)
{
if (-1 == append_interpolation_value(writer, e->v.Interpolation.value)) {
if (-1 == append_interpolation_str(writer, e->v.Interpolation.str)) {
return -1;
}