@@ -675,7 +675,6 @@ def f_with_multiline():
675
675
' ~~~~~~~~^^\n '
676
676
f' File "{ __file__ } ", line { lineno_f + 2 } , in f_with_multiline\n '
677
677
' return compile(code, "?", "exec")\n '
678
- ' ~~~~~~~^^^^^^^^^^^^^^^^^^^\n '
679
678
' File "?", line 7\n '
680
679
' foo(a, z\n '
681
680
' ^'
@@ -765,8 +764,8 @@ def f_with_binary_operator():
765
764
def test_caret_for_binary_operators_with_spaces_and_parenthesis (self ):
766
765
def f_with_binary_operator ():
767
766
a = 1
768
- b = ""
769
- return ( a ) + b
767
+ b = c = ""
768
+ return ( a ) + b + c
770
769
771
770
lineno_f = f_with_binary_operator .__code__ .co_firstlineno
772
771
expected_error = (
@@ -775,7 +774,7 @@ def f_with_binary_operator():
775
774
' callable()\n '
776
775
' ~~~~~~~~^^\n '
777
776
f' File "{ __file__ } ", line { lineno_f + 3 } , in f_with_binary_operator\n '
778
- ' return ( a ) +b\n '
777
+ ' return ( a ) +b + c \n '
779
778
' ~~~~~~~~~~^~\n '
780
779
)
781
780
result_lines = self .get_exception(f_with_binary_operator )
@@ -963,7 +962,7 @@ def f1(a):
963
962
def f2 (b ):
964
963
raise RuntimeError ("fail" )
965
964
return f2
966
- return f1 ("x" )("y" )
965
+ return f1 ("x" )("y" )( "z" )
967
966
968
967
lineno_f = f_with_call .__code__ .co_firstlineno
969
968
expected_error = (
@@ -972,7 +971,7 @@ def f2(b):
972
971
' callable()\n '
973
972
' ~~~~~~~~^^\n '
974
973
f' File "{ __file__ } ", line { lineno_f + 5 } , in f_with_call\n '
975
- ' return f1("x")("y")\n '
974
+ ' return f1("x")("y")("z") \n '
976
975
' ~~~~~~~^^^^^\n '
977
976
f' File "{ __file__ } ", line { lineno_f + 3 } , in f2\n '
978
977
' raise RuntimeError("fail")\n '
@@ -1487,6 +1486,186 @@ def f():
1487
1486
' raise MemoryError()' ]
1488
1487
self .assertEqual (actual , expected )
1489
1488
1489
+ def test_anchors_for_simple_return_statements_are_eluded (self ):
1490
+ def g ():
1491
+ 1 / 0
1492
+
1493
+ def f ():
1494
+ return g ()
1495
+
1496
+ result_lines = self .get_exception (f )
1497
+ expected = ['Traceback (most recent call last):' ,
1498
+ f" File \" { __file__ } \" , line { self .callable_line } , in get_exception" ,
1499
+ " callable()" ,
1500
+ " ~~~~~~~~^^" ,
1501
+ f" File \" { __file__ } \" , line { f .__code__ .co_firstlineno + 1 } , in f" ,
1502
+ " return g()" ,
1503
+ f" File \" { __file__ } \" , line { g .__code__ .co_firstlineno + 1 } , in g" ,
1504
+ " 1/0" ,
1505
+ " ~^~"
1506
+ ]
1507
+ self .assertEqual (result_lines , expected )
1508
+
1509
+ def g ():
1510
+ 1 / 0
1511
+
1512
+ def f ():
1513
+ return g () + 1
1514
+
1515
+ result_lines = self .get_exception (f )
1516
+ expected = ['Traceback (most recent call last):' ,
1517
+ f" File \" { __file__ } \" , line { self .callable_line } , in get_exception" ,
1518
+ " callable()" ,
1519
+ " ~~~~~~~~^^" ,
1520
+ f" File \" { __file__ } \" , line { f .__code__ .co_firstlineno + 1 } , in f" ,
1521
+ " return g() + 1" ,
1522
+ " ~^^" ,
1523
+ f" File \" { __file__ } \" , line { g .__code__ .co_firstlineno + 1 } , in g" ,
1524
+ " 1/0" ,
1525
+ " ~^~"
1526
+ ]
1527
+ self .assertEqual (result_lines , expected )
1528
+
1529
+ def g (* args ):
1530
+ 1 / 0
1531
+
1532
+ def f ():
1533
+ return g (1 ,
1534
+ 2 , 4 ,
1535
+ 5 )
1536
+
1537
+ result_lines = self .get_exception (f )
1538
+ expected = [
10000
9;Traceback (most recent call last):' ,
1539
+ f" File \" { __file__ } \" , line { self .callable_line } , in get_exception" ,
1540
+ " callable()" ,
1541
+ " ~~~~~~~~^^" ,
1542
+ f" File \" { __file__ } \" , line { f .__code__ .co_firstlineno + 1 } , in f" ,
1543
+ " return g(1," ,
1544
+ " 2, 4," ,
1545
+ " 5)" ,
1546
+ f" File \" { __file__ } \" , line { g .__code__ .co_firstlineno + 1 } , in g" ,
1547
+ " 1/0" ,
1548
+ " ~^~"
1549
+ ]
1550
+ self .assertEqual (result_lines , expected )
1551
+
1552
+ def g (* args ):
1553
+ 1 / 0
1554
+
1555
+ def f ():
1556
+ return g (1 ,
1557
+ 2 , 4 ,
1558
+ 5 ) + 1
1559
+
1560
+ result_lines = self .get_exception (f )
1561
+ expected = ['Traceback (most recent call last):' ,
1562
+ f" File \" { __file__ } \" , line { self .callable_line } , in get_exception" ,
1563
+ " callable()" ,
1564
+ " ~~~~~~~~^^" ,
1565
+ f" File \" { __file__ } \" , line { f .__code__ .co_firstlineno + 1 } , in f" ,
1566
+ " return g(1," ,
1567
+ " ~^^^" ,
1568
+ " 2, 4," ,
1569
+ " ^^^^^" ,
1570
+ " 5) + 1" ,
1571
+ " ^^" ,
1572
+ f" File \" { __file__ } \" , line { g .__code__ .co_firstlineno + 1 } , in g" ,
1573
+ " 1/0" ,
1574
+ " ~^~"
1575
+ ]
1576
+ self .assertEqual (result_lines , expected )
1577
+
1578
+
1579
+
1580
+ def test_anchors_for_simple_assign_statements_are_eluded (self ):
1581
+ def g ():
1582
+ 1 / 0
1583
+
1584
+ def f ():
1585
+ x = g ()
1586
+
1587
+ result_lines = self .get_exception (f )
1588
+ expected = ['Traceback (most recent call last):' ,
1589
+ f" File \" { __file__ } \" , line { self .callable_line } , in get_exception" ,
1590
+ " callable()" ,
1591
+ " ~~~~~~~~^^" ,
1592
+ f" File \" { __file__ } \" , line { f .__code__ .co_firstlineno + 1 } , in f" ,
1593
+ " x = g()" ,
1594
+ f" File \" { __file__ } \" , line { g .__code__ .co_firstlineno + 1 } , in g" ,
1595
+ " 1/0" ,
1596
+ " ~^~"
1597
+ ]
1598
+ self .assertEqual (result_lines , expected )
1599
+
1600
+ def g (* args ):
1601
+ 1 / 0
1602
+
1603
+ def f ():
1604
+ x = g (1 ,
1605
+ 2 , 3 ,
1606
+ 4 )
1607
+
1608
+ result_lines = self .get_exception (f )
1609
+ expected = ['Traceback (most recent call last):' ,
1610
+ f" File \" { __file__ } \" , line { self .callable_line } , in get_exception" ,
1611
+ " callable()" ,
1612
+ " ~~~~~~~~^^" ,
1613
+ f" File \" { __file__ } \" , line { f .__code__ .co_firstlineno + 1 } , in f" ,
1614
+ " x = g(1," ,
1615
+ " 2, 3," ,
1616
+ " 4)" ,
1617
+ f" File \" { __file__ } \" , line { g .__code__ .co_firstlineno + 1 } , in g" ,
1618
+ " 1/0" ,
1619
+ " ~^~"
1620
+ ]
1621
+ self .assertEqual (result_lines , expected )
1622
+
1623
+ def g ():
1624
+ 1 / 0
1625
+
1626
+ def f ():
1627
+ x = y = g ()
1628
+
1629
+ result_lines = self .get_exception (f )
1630
+ expected = ['Traceback (most recent call last):' ,
1631
+ f" File \" { __file__ } \" , line { self .callable_line } , in get_exception" ,
1632
+ " callable()" ,
1633
+ " ~~~~~~~~^^" ,
1634
+ f" File \" { __file__ } \" , line { f .__code__ .co_firstlineno + 1 } , in f" ,
1635
+ " x = y = g()" ,
1636
+ " ~^^" ,
1637
+ f" File \" { __file__ } \" , line { g .__code__ .co_firstlineno + 1 } , in g" ,
1638
+ " 1/0" ,
1639
+ " ~^~"
1640
+ ]
1641
+ self .assertEqual (result_lines , expected )
1642
+
1643
+ def g (* args ):
1644
+ 1 / 0
1645
+
1646
+ def f ():
1647
+ x = y = g (1 ,
1648
+ 2 , 3 ,
1649
+ 4 )
1650
+
1651
+ result_lines = self .get_exception (f )
1652
+ expected = ['Traceback (most recent call last):' ,
1653
+ f" File \" { __file__ } \" , line { self .callable_line } , in get_exception" ,
1654
+ " callable()" ,
1655
+ " ~~~~~~~~^^" ,
1656
+ f" File \" { __file__ } \" , line { f .__code__ .co_firstlineno + 1 } , in f" ,
1657
+ " x = y = g(1," ,
1658
+ " ~^^^" ,
1659
+ " 2, 3," ,
1660
+ " ^^^^^" ,
1661
+ " 4)" ,
1662
+ " ^^" ,
1663
+ f" File \" { __file__ } \" , line { g .__code__ .co_firstlineno + 1 } , in g" ,
1664
+ " 1/0" ,
1665
+ " ~^~"
1666
+ ]
1667
+ self .assertEqual (result_lines , expected )
1668
+
1490
1669
1491
1670
@requires_debug_ranges ()
1492
1671
class PurePythonTracebackErrorCaretTests (
@@ -1681,7 +1860,7 @@ def f():
1681
1860
# Check a known (limited) number of recursive invocations
1682
1861
def g (count = 10 ):
1683
1862
if count :
1684
- return g (count - 1 )
1863
+ return g (count - 1 ) + 1
1685
1864
raise ValueError
1686
1865
1687
1866
with captured_output ("stderr" ) as stderr_g :
@@ -1695,13 +1874,13 @@ def g(count=10):
1695
1874
lineno_g = g .__code__ .co_firstlineno
1696
1875
result_g = (
1697
1876
f' File "{ __file__ } ", line { lineno_g + 2 } , in g\n '
1698
- ' return g(count-1)\n '
1877
+ ' return g(count-1) + 1 \n '
1699
1878
' ~^^^^^^^^^\n '
1700
1879
f' File "{ __file__ } ", line { lineno_g + 2 } , in g\n '
1701
- ' return g(count-1)\n '
1880
+ ' return g(count-1) + 1 \n '
1702
1881
' ~^^^^^^^^^\n '
1703
1882
f' File "{ __file__ } ", line { lineno_g + 2 } , in g\n '
1704
- ' return g(count-1)\n '
1883
+ ' return g(count-1) + 1 \n '
1705
1884
' ~^^^^^^^^^\n '
1706
1885
' [Previous line repeated 7 more times]\n '
1707
1886
f' File "{ __file__ } ", line { lineno_g + 3 } , in g\n '
@@ -1740,13 +1919,10 @@ def h(count=10):
1740
1919
' ~^^\n '
1741
1920
f' File "{ __file__ } ", line { lineno_h + 2 } , in h\n '
1742
1921
' return h(count-1)\n '
1743
- ' ~^^^^^^^^^\n '
1744
1922
f' File "{ __file__ } ", line { lineno_h + 2 } , in h\n '
1745
1923
' return h(count-1)\n '
1746
- ' ~^^^^^^^^^\n '
1747
1924
f' File "{ __file__ } ", line { lineno_h + 2 } , in h\n '
1748
1925
' return h(count-1)\n '
1749
- ' ~^^^^^^^^^\n '
1750
1926
' [Previous line repeated 7 more times]\n '
1751
1927
f' File "{ __file__ } ", line { lineno_h + 3 } , in h\n '
1752
1928
' g()\n '
@@ -1766,21 +1942,21 @@ def h(count=10):
1766
1942
self .fail ("no error raised" )
1767
1943
result_g = (
1768
1944
f' File "{ __file__ } ", line { lineno_g + 2 } , in g\n '
1769
- ' return g(count-1)\n '
1945
+ ' return g(count-1) + 1 \n '
1770
1946
' ~^^^^^^^^^\n '
1771
1947
f' File "{ __file__ } ", line { lineno_g + 2 } , in g\n '
1772
- ' return g(count-1)\n '
1948
+ ' return g(count-1) + 1 \n '
1773
1949
' ~^^^^^^^^^\n '
1774
1950
f' File "{ __file__ } ", line { lineno_g + 2 } , in g\n '
1775
- ' return g(count-1)\n '
1951
+ ' return g(count-1) + 1 \n '
1776
1952
' ~^^^^^^^^^\n '
1777
1953
f' File "{ __file__ } ", line { lineno_g + 3 } , in g\n '
1778
1954
' raise ValueError\n '
1779
1955
'ValueError\n '
1780
1956
)
1781
1957
tb_line = (
1782
1958
'Traceback (most recent call last):\n '
1783
- f' File "{ __file__ } ", line { lineno_g + 80 } , in _check_recursive_traceback_display\n '
1959
+ f' File "{ __file__ } ", line { lineno_g + 77 } , in _check_recursive_traceback_display\n '
1784
1960
' g(traceback._RECURSIVE_CUTOFF)\n '
1785
1961
' ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n '
1786
1962
)
@@ -1798,13 +1974,13 @@ def h(count=10):
1798
1974
self .fail ("no error raised" )
1799
1975
result_g = (
1800
1976
f' File "{ __file__ } ", line { lineno_g + 2 } , in g\n '
1801
- ' return g(count-1)\n '
1977
+ ' return g(count-1) + 1 \n '
1802
1978
' ~^^^^^^^^^\n '
1803
1979
f' File "{ __file__ } ", line { lineno_g + 2 } , in g\n '
1804
- ' return g(count-1)\n '
1980
+ ' return g(count-1) + 1 \n '
1805
1981
' ~^^^^^^^^^\n '
1806
1982
f' File "{ __file__ } ", line { lineno_g + 2 } , in g\n '
1807
- ' return g(count-1)\n '
1983
+ ' return g(count-1) + 1 \n '
1808
1984
' ~^^^^^^^^^\n '
1809
1985
' [Previous line repeated 1 more time]\n '
1810
1986
f' File "{ __file__ } ", line { lineno_g + 3 } , in g\n '
@@ -1813,14 +1989,14 @@ def h(count=10):
1813
1989
)
1814
1990
tb_line = (
1815
1991
'Traceback (most recent call last):\n '
1816
- f' File "{ __file__ } ", line { lineno_g + 112 } , in _check_recursive_traceback_display\n '
1992
+ f' File "{ __file__ } ", line { lineno_g + 109 } , in _check_recursive_traceback_display\n '
1817
1993
' g(traceback._RECURSIVE_CUTOFF + 1)\n '
1818
1994
' ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n '
1819
1995
)
1820
1996
expected = self ._maybe_filter_debug_ranges ((tb_line + result_g ).splitlines ())
1821
1997
actual = stderr_g .getvalue ().splitlines ()
1822
1998
self .assertEqual (actual , expected )
1823
-
1999
+
1824
2000
@requires_debug_ranges ()
1825
2001
def test_recursive_traceback (self ):
1826
2002
if self .DEBUG_RANGES :
0 commit comments