You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
sys.setrecursionlimit docs are incorrect in 3.12 and 3.13 #112282
Since 3.12, sys.setrecursionlimit does not control the recursion limit of the C stack (it's hardcoded in Py_C_RECURSION_LIMIT, due to #91079), while the 3.13 docs say
Set the maximum depth of the Python interpreter stack to limit.
This limit prevents infinite recursion from causing an overflow of the C stack and crashing Python.
The fallout can be seen in #112215 (basically, any code that uses lru_cache in combination with sys.setrecursionlimit is potentially, or actually, broken in 3.12, while still working in 3.11) or in #107263 (which was papered over with an increase of Py_C_RECURSION_LIMIT, not really fixed).
This is an obvious change of behaviour, as code working in 3.11 can easily be broken in 3.12, as found in #112215
$ python3.11 <fib.py
139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125
$ python3.12 <fib.py
Traceback (most recent call last):
File "<stdin>", line 15, in <module>
File "<stdin>", line 13, in fib
File "<stdin>", line 13, in fib
File "<stdin>", line 13, in fib
[Previous line repeated 496 more times]
RecursionError: maximum recursion depth exceeded
Such changes should carry a warning in the documentation.
Potentially, any recursive Python code combining C recursion (in a module, e.g. lru_cache, via @lru_cache decorator) with increased (beyond the hardcoded Py_C_RECURSION_LIMIT) sys.setrecursionlimit is bound to be broken in 3.12.
I believe the whole hardcoding of Py_C_RECURSION_LIMIT has to be fixed (perhaps with a separate API provided to change it), as it's a regression and an incompatible change of code behaviour, but meanwhile the docs have to reflect the reality.
In particular, we are unable to move from python 3.11 to anything higher, since we can no longer pickle.dump our objects, even if sys.setrecursionlimit is called beforehand for example.
I think it would also be worth documenting that the recursion limit can also be triggered by long import chains, as described in this issue. Do people agree, and if so does it make sense to fold that issue into this one?
Activity
Jiehong commentedon Oct 9, 2024
I confirm this breaks some code out there.
In particular, we are unable to move from python 3.11 to anything higher, since we can no longer
pickle.dumpour objects, even ifsys.setrecursionlimitis called beforehand for example.seddonym commentedon Jan 7, 2025
+1 to updating the docs. The text from What's New in Python 3.12 might be a good starting point.
I think it would also be worth documenting that the recursion limit can also be triggered by long import chains, as described in this issue. Do people agree, and if so does it make sense to fold that issue into this one?
B1oomEe commentedon Jan 31, 2025
same issue
LCcodder commentedon Jan 31, 2025
I have same issue with my 3.12 python
[Previous line repeated 496 more times] RecursionError: maximum recursion depth exceededTried with python 3.11 and 3.8 and everything works
pythongh-133079: Remove Py_C_RECURSION_LIMIT & PyThreadState.c_recurs…
gh-133079: Remove Py_C_RECURSION_LIMIT & PyThreadState.c_recursion_re…
encukou commentedon Nov 20, 2025
This is a duplicate of #112215.
@functools.cache#112215kbulygin commentedon Oct 1, 2026
Is it really a duplicate? #112215 is not about docs.