Content-Length: 10862 | pFad | http://github.com/python/cpython/pull/136441.patch
thub.com
From e623f20fb6533c7c39a99625602eb2f3f1d3e7fa Mon Sep 17 00:00:00 2001
From: Dave
Date: Tue, 8 Jul 2025 23:51:19 +0000
Subject: [PATCH 1/4] Add default for `Interpolation.expression` of `""`
---
Objects/clinic/interpolationobject.c.h | 23 ++++++++++++++---------
Objects/interpolationobject.c | 4 ++--
2 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/Objects/clinic/interpolationobject.c.h b/Objects/clinic/interpolationobject.c.h
index 7a94dabafc92f2..2030e17e49e47a 100644
--- a/Objects/clinic/interpolationobject.c.h
+++ b/Objects/clinic/interpolationobject.c.h
@@ -47,26 +47,31 @@ interpolation_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
PyObject *argsbuf[4];
PyObject * const *fastargs;
Py_ssize_t nargs = PyTuple_GET_SIZE(args);
- Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 2;
+ Py_ssize_t noptargs = nargs + (kwargs ? PyDict_GET_SIZE(kwargs) : 0) - 1;
PyObject *value;
- PyObject *expression;
+ PyObject *expression = &_Py_STR(empty);
PyObject *conversion = Py_None;
PyObject *format_spec = &_Py_STR(empty);
fastargs = _PyArg_UnpackKeywords(_PyTuple_CAST(args)->ob_item, nargs, kwargs, NULL, &_parser,
- /*minpos*/ 2, /*maxpos*/ 4, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
+ /*minpos*/ 1, /*maxpos*/ 4, /*minkw*/ 0, /*varpos*/ 0, argsbuf);
if (!fastargs) {
goto exit;
}
value = fastargs[0];
- if (!PyUnicode_Check(fastargs[1])) {
- _PyArg_BadArgument("Interpolation", "argument 'expression'", "str", fastargs[1]);
- goto exit;
- }
- expression = fastargs[1];
if (!noptargs) {
goto skip_optional_pos;
}
+ if (fastargs[1]) {
+ if (!PyUnicode_Check(fastargs[1])) {
+ _PyArg_BadArgument("Interpolation", "argument 'expression'", "str", fastargs[1]);
+ goto exit;
+ }
+ expression = fastargs[1];
+ if (!--noptargs) {
+ goto skip_optional_pos;
+ }
+ }
if (fastargs[2]) {
if (!_conversion_converter(fastargs[2], &conversion)) {
goto exit;
@@ -86,4 +91,4 @@ interpolation_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
exit:
return return_value;
}
-/*[clinic end generated code: output=599742a5ccd6f060 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=2391391e2d7708c0 input=a9049054013a1b77]*/
diff --git a/Objects/interpolationobject.c b/Objects/interpolationobject.c
index a5d407a7b0e296..b58adb693f0cae 100644
--- a/Objects/interpolationobject.c
+++ b/Objects/interpolationobject.c
@@ -54,7 +54,7 @@ typedef struct {
Interpolation.__new__ as interpolation_new
value: object
- expression: object(subclass_of='&PyUnicode_Type')
+ expression: object(subclass_of='&PyUnicode_Type', c_default='&_Py_STR(empty)') = ""
conversion: object(converter='_conversion_converter') = None
format_spec: object(subclass_of='&PyUnicode_Type', c_default='&_Py_STR(empty)') = ""
[clinic start generated code]*/
@@ -63,7 +63,7 @@ static PyObject *
interpolation_new_impl(PyTypeObject *type, PyObject *value,
PyObject *expression, PyObject *conversion,
PyObject *format_spec)
-/*[clinic end generated code: output=6488e288765bc1a9 input=d91711024068528c]*/
+/*[clinic end generated code: output=6488e288765bc1a9 input=fc5c285c1dd23d36]*/
{
interpolationobject *self = PyObject_GC_New(interpolationobject, type);
if (!self) {
From 80ae523debe60c8929f09b6c2d397f13e61b61e2 Mon Sep 17 00:00:00 2001
From: Dave
Date: Tue, 8 Jul 2025 23:54:00 +0000
Subject: [PATCH 2/4] Blurb the Interpolation.expression default.
---
.../2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst | 1 +
1 file changed, 1 insertion(+)
create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst
new file mode 100644
index 00000000000000..9930413b53c150
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-08-23-53-51.gh-issue-132661.B84iYt.rst
@@ -0,0 +1 @@
+``Interpolation.expression`` now has a default, the empty string.
From c8976f4ca96932af33f253601e896ac19439d746 Mon Sep 17 00:00:00 2001
From: Dave
Date: Wed, 9 Jul 2025 19:16:15 +0000
Subject: [PATCH 3/4] Add support for Interpolation default values.
---
Lib/test/test_string/_support.py | 35 ++++++++++++++----------
Lib/test/test_string/test_templatelib.py | 13 +++++++++
2 files changed, 33 insertions(+), 15 deletions(-)
diff --git a/Lib/test/test_string/_support.py b/Lib/test/test_string/_support.py
index abdddaf187b4fe..00416e3f767019 100644
--- a/Lib/test/test_string/_support.py
+++ b/Lib/test/test_string/_support.py
@@ -2,6 +2,23 @@
class TStringBaseCase:
+ def assertInterpolationEqual(self, i, exp):
+ """Test Interpolation equality.
+
+ The *i* argument must be an Interpolation instance.
+
+ The *exp* argument must be a tuple of the form
+ (value, expression, conversion, format_spec) where the final three
+ items may be omitted and are assumed to be '', None and '' respectively.
+ """
+ # Merge in defaults for expression, conversion, and format_spec
+ defaults = ('', None, '')
+ expected = exp + defaults[len(exp) - 1:]
+
+ actual = (i.value, i.expression, i.conversion, i.format_spec)
+ self.assertEqual(actual, expected)
+
+
def assertTStringEqual(self, t, strings, interpolations):
"""Test template string literal equality.
@@ -9,26 +26,14 @@ def assertTStringEqual(self, t, strings, interpolations):
The *interpolations* argument must be a sequence of tuples which are
compared against *t.interpolations*. Each tuple consists of
- (value, expression, conversion, format_spec), though the final two
- items may be omitted, and are assumed to be None and '' respectively.
+ (value, expression, conversion, format_spec), though the final three
+ items may be omitted and are assumed to be '' None, and '' respectively.
"""
self.assertEqual(t.strings, strings)
self.assertEqual(len(t.interpolations), len(interpolations))
for i, exp in zip(t.interpolations, interpolations, strict=True):
- if len(exp) == 4:
- actual = (i.value, i.expression, i.conversion, i.format_spec)
- self.assertEqual(actual, exp)
- continue
-
- if len(exp) == 3:
- self.assertEqual((i.value, i.expression, i.conversion), exp)
- self.assertEqual(i.format_spec, '')
- continue
-
- self.assertEqual((i.value, i.expression), exp)
- self.assertEqual(i.format_spec, '')
- self.assertIsNone(i.conversion)
+ self.assertInterpolationEqual(i, exp)
def convert(value, conversion):
diff --git a/Lib/test/test_string/test_templatelib.py b/Lib/test/test_string/test_templatelib.py
index 85fcff486d6616..adaf590e64dad6 100644
--- a/Lib/test/test_string/test_templatelib.py
+++ b/Lib/test/test_string/test_templatelib.py
@@ -45,6 +45,19 @@ def test_basic_creation(self):
self.assertEqual(len(t.interpolations), 0)
self.assertEqual(fstring(t), 'Hello,\nworld')
+ def test_interpolation_creation(self):
+ i = Interpolation('Maria', 'name', 'a', 'fmt')
+ self.assertInterpolationEqual(i, ('Maria', 'name', 'a', 'fmt'))
+
+ i = Interpolation('Maria', 'name', 'a')
+ self.assertInterpolationEqual(i, ('Maria', 'name', 'a'))
+
+ i = Interpolation('Maria', 'name')
+ self.assertInterpolationEqual(i, ('Maria', 'name'))
+
+ i = Interpolation('Maria')
+ self.assertInterpolationEqual(i, ('Maria',))
+
def test_creation_interleaving(self):
# Should add strings on either side
t = Template(Interpolation('Maria', 'name', None, ''))
From 879a0d77d543027d79a53320cd67cb344314f872 Mon Sep 17 00:00:00 2001
From: Dave
Date: Wed, 9 Jul 2025 22:01:11 +0000
Subject: [PATCH 4/4] I think I prefer this more explicit implementation of
assertInterpolationEqual()
---
Lib/test/test_string/_support.py | 27 +++++++++++++++++----------
1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/Lib/test/test_string/_support.py b/Lib/test/test_string/_support.py
index 00416e3f767019..e1d7f6f6500aeb 100644
--- a/Lib/test/test_string/_support.py
+++ b/Lib/test/test_string/_support.py
@@ -11,13 +11,21 @@ def assertInterpolationEqual(self, i, exp):
(value, expression, conversion, format_spec) where the final three
items may be omitted and are assumed to be '', None and '' respectively.
"""
- # Merge in defaults for expression, conversion, and format_spec
- defaults = ('', None, '')
- expected = exp + defaults[len(exp) - 1:]
-
- actual = (i.value, i.expression, i.conversion, i.format_spec)
- self.assertEqual(actual, expected)
-
+ if len(exp) == 4:
+ actual = (i.value, i.expression, i.conversion, i.format_spec)
+ self.assertEqual(actual, exp)
+ elif len(exp) == 3:
+ self.assertEqual((i.value, i.expression, i.conversion), exp)
+ self.assertEqual(i.format_spec, "")
+ elif len(exp) == 2:
+ self.assertEqual((i.value, i.expression), exp)
+ self.assertEqual(i.conversion, None)
+ self.assertEqual(i.format_spec, "")
+ elif len(exp) == 1:
+ self.assertEqual((i.value,), exp)
+ self.assertEqual(i.expression, "")
+ self.assertEqual(i.conversion, None)
+ self.assertEqual(i.format_spec, "")
def assertTStringEqual(self, t, strings, interpolations):
"""Test template string literal equality.
@@ -25,9 +33,8 @@ def assertTStringEqual(self, t, strings, interpolations):
The *strings* argument must be a tuple of strings equal to *t.strings*.
The *interpolations* argument must be a sequence of tuples which are
- compared against *t.interpolations*. Each tuple consists of
- (value, expression, conversion, format_spec), though the final three
- items may be omitted and are assumed to be '' None, and '' respectively.
+ compared against *t.interpolations*. Each tuple must match the form
+ described in the `assertInterpolationEqual` method.
"""
self.assertEqual(t.strings, strings)
self.assertEqual(len(t.interpolations), len(interpolations))
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/python/cpython/pull/136441.patch
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy