@@ -1831,6 +1831,42 @@ def test_newlines_in_format_specifiers(self):
18311831 for case in valid_cases :
18321832 compile (case , "<string>" , "exec" )
18331833
1834+ def test_raw_fstring_format_spec (self ):
1835+ """Test raw f-string format spec behavior (Issue #137314).
1836+
1837+ Raw f-strings should preserve literal backslashes in format specifications,
1838+ not interpret them as escape sequences.
1839+ """
1840+ class UnchangedFormat :
1841+ """Test helper that returns the format spec unchanged."""
1842+ def __format__ (self , format ):
1843+ return format
1844+
1845+ # Test basic Unicode escape
1846+ non_raw = f"{ UnchangedFormat ():\xFF} "
1847+ self .assertEqual (non_raw , 'ÿ' )
1848+
1849+ raw = rf"{ UnchangedFormat ():\xFF} "
1850+ self .assertEqual (raw , '\\ xFF' )
1851+
1852+ # Test newline escape
1853+ non_raw = f"{ UnchangedFormat ():\n} "
1854+ self .assertEqual (non_raw , '\n ' )
1855+
1856+ raw = rf"{ UnchangedFormat ():\n} "
1857+ self .assertEqual (raw , '\\ n' )
1858+
1859+ # Test tab escape
1860+ non_raw = f"{ UnchangedFormat ():\t} "
1861+ self .assertEqual (non_raw , '\t ' )
1862+
1863+ raw = rf"{ UnchangedFormat ():\t} "
1864+ self .assertEqual (raw , '\\ t' )
1865+
1866+ # Test multiple format specs in same raw f-string
1867+ result = rf"{ UnchangedFormat ():\xFF} { UnchangedFormat ():\n} "
1868+ self .assertEqual (result , '\\ xFF \\ n' )
1869+
18341870
18351871if __name__ == '__main__' :
18361872 unittest .main ()
0 commit comments