`trace` function is cleared after `RecursionError` is fired
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 35.9k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug report
Bug description:
I'm using coverage and pytest-cov in CI to measure the line coverage of the unittests. It is achieved by registering a trace function with sys.settrace.
However, after binsecting my unittests, I found that when a RecursionError is raised, the system trace function will be cleared. That will cause a warning emitted by coverage:
~/Projects/cpython/venv/lib/python3.15t/site-packages/coverage/pytracer.py:355: CoverageWarning: Trace function changed, data is likely wrong: None != <bound method PyTracer._trace of <PyTracer at 0x200021dcc20: 2076 data points in 11 files>> (trace-changed)
self.warn(
Reproducible code:
import sys
def tracer(*args, **kwargs):
pass
def factorial(n: int) -> int:
"""Calculate the factorial of a number."""
if n <= 1:
return 1
return n * factorial(n - 1)
sys.settrace(tracer)
assert sys.gettrace() is tracer
sys.setrecursionlimit(64)
assert sys.gettrace() is tracer
try:
_ = factorial(100)
except RecursionError:
pass
assert sys.gettrace() is None
REPL Output:
# Add a code block here, if required
$ python3
Python 3.13.3 (main, Apr 8 2025, 13:54:08) [Clang 16.0.0 (clang-1600.0.26.6)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> def tracer(*args, **kwargs):
... pass
...
>>> def factorial(n):
... if n <= 1:
... return 1
... return n * factorial(n - 1)
...
>>> sys.settrace(tracer)
>>> sys.gettrace() is tracer
True
>>> sys.setrecursionlimit(64)
>>> _ = factorial(100)
Traceback (most recent call last):
File "<python-input-6>", line 1, in <module>
_ = factorial(100)
File "<python-input-2>", line 4, in factorial
return n * factorial(n - 1)
~~~~~~~~^^^^^^^
File "<python-input-2>", line 4, in factorial
return n * factorial(n - 1)
~~~~~~~~^^^^^^^
File "<python-input-2>", line 4, in factorial
return n * factorial(n - 1)
~~~~~~~~^^^^^^^
[Previous line repeated 51 more times]
File "<python-input-2>", line 1, in factorial
def factorial(n):
RecursionError: maximum recursion depth exceeded
>>> sys.gettrace() is None
True
CPython versions tested on:
CPython main branch
Operating systems tested on:
macOS
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Führe den bereitgestellten Reproducer aus und untersuche das Verhalten von sys.settrace, sys.gettrace und RecursionError rund um den rekursiven Aufruf von factorial. Verfolge die beteiligten CPython-Implementierungspfade für die Behandlung des Rekursionslimits und das Tracing; abgeschlossen ist die Aufgabe, wenn die registrierte Trace-Funktion nach dem RecursionError weiterhin verfügbar ist und eine Regressionstestabdeckung für den Reproducer vorhanden ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 45/100