python / cpython

The Python programming language
https://www.python.org
Other
63.1k stars 30.22k forks source link

Python implementation of traceback limit does not default to 1000 as documented in 3.13 #123596

Open blhsing opened 1 month ago

blhsing commented 1 month ago

Bug report

Bug description:

According to the documentation of sys.tracebacklimit, it should default to 1000 if not set, so the following snippet:

import sys

def f():
    f()

sys.setrecursionlimit(2000)
f()

produces a traceback of 1000 frames as expected in 3.12:

Traceback (most recent call last):
  File "t.py", line 4, in f
    f()
    ~^^
  File "t.py", line 4, in f
    f()
    ~^^
  File "t.py", line 4, in f
    f()
    ~^^
  [Previous line repeated 997 more times]
RecursionError: maximum recursion depth exceeded

But in 3.13 and the current master, it produces a traceback of all 2000 frames:

Traceback (most recent call last):
  File "t.py", line 4, in f
    f()
    ~^^
  File "t.py", line 4, in f
    f()
    ~^^
  File "t.py", line 4, in f
    f()
    ~^^
  File "t.py", line 4, in f
    f()
    ~^^
  [Previous line repeated 1996 more times]
RecursionError: maximum recursion depth exceeded

This is because with issue #110721, traceback is now printed with the traceback module by default, and the traceback module defaults sys.tracebacklimit to None when not set: https://github.com/python/cpython/blob/c3ed775899eedd47d37f8f1840345b108920e400/Lib/traceback.py#L458

whereas the C implementation of the traceback printer has a proper default of 1000 for sys.tracebacklimit as documented: https://github.com/python/cpython/blob/c3ed775899eedd47d37f8f1840345b108920e400/Python/traceback.c#L707

I will submit a PR to make 1000 the default value for sys.tracebacklimit in the Python implementation of the traceback module.

CPython versions tested on:

3.13, CPython main branch

Operating systems tested on:

Linux, Windows

Linked PRs

cfbolz commented 1 month ago

Nice find! When fixing you need to be careful not to change the behavior for existing explicit users of the traceback module. The traceback module has a special sentinel that is passed for 'builtin' traceback formatting, look for builtin_limit.

rruuaanng commented 1 day ago

Are you still studying the problem? If you are ready to submit, maybe I will close my submission. Be sorry.:)