mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	Co-authored-by: Lysandros Nikolaou <lisandrosnik@gmail.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Wingy <git@wingysam.xyz> Co-authored-by: Koudai Aono <koxudaxi@gmail.com> Co-authored-by: Dave Peck <davepeck@gmail.com> Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu> Co-authored-by: Paul Everitt <pauleveritt@me.com> Co-authored-by: sobolevn <mail@sobolevn.me>
		
			
				
	
	
		
			55 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import unittest
 | 
						|
from string.templatelib import Interpolation
 | 
						|
 | 
						|
 | 
						|
class TStringBaseCase:
 | 
						|
    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 consists of
 | 
						|
        (value, expression, conversion, format_spec), though the final two
 | 
						|
        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)
 | 
						|
 | 
						|
 | 
						|
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)
 |