| from string.templatelib import Interpolation | |
| 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. | |
| """ | |
| 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. | |
| 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 must match the form | |
| described in the `assertInterpolationEqual` method. | |
| """ | |
| self.assertEqual(t.strings, strings) | |
| self.assertEqual(len(t.interpolations), len(interpolations)) | |
| for i, exp in zip(t.interpolations, interpolations, strict=True): | |
| self.assertInterpolationEqual(i, exp) | |
| def convert(value, conversion): | |
| if conversion == "a": | |
| return ascii(value) | |
| elif conversion == "r": | |
| return repr(value) | |
| elif conversion == "s": | |
| return str(value) | |
| return value | |
| def fstring(template): | |
| parts = [] | |
| for item in template: | |
| match item: | |
| case str() as s: | |
| parts.append(s) | |
| case Interpolation(value, _, conversion, format_spec): | |
| value = convert(value, conversion) | |
| value = format(value, format_spec) | |
| parts.append(value) | |
| return "".join(parts) |