@@ -1831,6 +1831,34 @@ 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+ class UnchangedFormat :
1840+ """Test helper that returns the format spec unchanged."""
1841+ def __format__ (self , format ):
1842+ return format
1843+
1844+ # Test basic escape sequences
1845+ self .assertEqual (f"{ UnchangedFormat ():\xFF} " , 'ÿ' )
1846+ self .assertEqual (rf"{ UnchangedFormat ():\xFF} " , '\\ xFF' )
1847+
1848+ # Test nested expressions with raw/non-raw combinations
1849+ self .assertEqual (rf"{ UnchangedFormat ():{'\xFF ' }} " , 'ÿ' )
1850+ self .assertEqual (f"{ UnchangedFormat ():{r'\xFF' }} " , '\\ xFF' )
1851+ self .assertEqual (rf"{ UnchangedFormat ():{r'\xFF' }} " , '\\ xFF' )
1852+
1853+ # Test continuation character in format specs
1854+ self .assertEqual (f"""{ UnchangedFormat ():{'a' \
1855+ 'b' }} """ , 'ab' )
1856+ self .assertEqual (rf"""{ UnchangedFormat ():{'a' \
1857+ 'b' }} """ , 'ab' )
1858+
1859+ # Test multiple format specs in same raw f-string
1860+ self .assertEqual (rf"{ UnchangedFormat ():\xFF} { UnchangedFormat ():\n} " , '\\ xFF \\ n' )
1861+
18341862
18351863if __name__ == '__main__' :
18361864 unittest .main ()
0 commit comments