@@ -1821,6 +1821,34 @@ def test_newlines_in_format_specifiers(self):
18211821 for case in valid_cases :
18221822 compile (case , "<string>" , "exec" )
18231823
1824+ def test_raw_fstring_format_spec (self ):
1825+ # Test raw f-string format spec behavior (Issue #137314).
1826+ #
1827+ # Raw f-strings should preserve literal backslashes in format specifications,
1828+ # not interpret them as escape sequences.
1829+ class UnchangedFormat :
1830+ """Test helper that returns the format spec unchanged."""
1831+ def __format__ (self , format ):
1832+ return format
1833+
1834+ # Test basic escape sequences
1835+ self .assertEqual (f"{ UnchangedFormat ():\xFF} " , 'ÿ' )
1836+ self .assertEqual (rf"{ UnchangedFormat ():\xFF} " , '\\ xFF' )
1837+
1838+ # Test nested expressions with raw/non-raw combinations
1839+ self .assertEqual (rf"{ UnchangedFormat ():{'\xFF ' }} " , 'ÿ' )
1840+ self .assertEqual (f"{ UnchangedFormat ():{r'\xFF' }} " , '\\ xFF' )
1841+ self .assertEqual (rf"{ UnchangedFormat ():{r'\xFF' }} " , '\\ xFF' )
1842+
1843+ # Test continuation character in format specs
1844+ self .assertEqual (f"""{ UnchangedFormat ():{'a' \
1845+ 'b' }} """ , 'ab' )
1846+ self .assertEqual (rf"""{ UnchangedFormat ():{'a' \
1847+ 'b' }} """ , 'ab' )
1848+
1849+ # Test multiple format specs in same raw f-string
1850+ self .assertEqual (rf"{ UnchangedFormat ():\xFF} { UnchangedFormat ():\n} " , '\\ xFF \\ n' )
1851+
18241852
18251853if __name__ == '__main__' :
18261854 unittest .main ()
0 commit comments