monkeypatch.setattr fails to undo on objects with a custom __setattr__ (regression from #14969)
Maintainer antworten meist innerhalb von 1 Tag
@hardikkaurani arbeitet bereits daran.
Seit 24.9.2026.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 78/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- python
- Bereich
- testing-qa
Rechercherichtung
Beginne beim neuen Zweig in MonkeyPatch.setattr und vergleiche ihn mit dem im Issue beschriebenen vorherigen Verhalten. Füge in test_proxy.py einen Regressionstest hinzu, der das Objekt mit benutzerdefiniertem setattr/getattr verwendet, und führe diesen Test aus, um zu überprüfen, dass undo den ursprünglichen Wert wiederherstellt und der gepatchte Wert nicht in nachfolgenden Tests durchsickert.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Since #14969 (0c601d510, not released yet), monkeypatch.setattr doesn't restore attributes on objects that store them somewhere other than __dict__ through a custom __setattr__/__getattr__. Undo raises AttributeError, and the patched value leaks into later tests.
class Config:
"""Stores attributes in a private dict instead of __dict__."""
def __init__(self):
object.__setattr__(self, "_data", {"debug": False})
def __getattr__(self, name):
try:
return self._data[name]
except KeyError:
raise AttributeError(name) from None
def __setattr__(self, name, value):
self._data[name] = value
cfg = Config()
def test_patch(monkeypatch):
monkeypatch.setattr(cfg, "debug", True)
assert cfg.debug is True
def test_restored():
assert cfg.debug is False
On main:
ERROR test_proxy.py::test_patch - AttributeError: 'Config' object has no attribute 'debug'
FAILED test_proxy.py::test_restored - assert True is False
1 failed, 1 passed, 1 error
Just before 0c601d510, the same file passes (2 passed).
The new branch in MonkeyPatch.setattr takes the old value from target.__dict__.get(name, NOTSET) whenever target has a __dict__. It assumes that a plain setattr() writes into that dict. With a custom __setattr__ it doesn't, so the old value is recorded as NOTSET. undo() then calls delattr(cfg, "debug") instead of setting it back to False. That delattr fails, and the value stays patched.
@Shriprasad-P pointed out this exact case in a review on #14969, but it wasn't addressed before the merge. I'm opening this issue so it gets fixed before the next release.
One possible direction: only use the __dict__ lookup when name is actually present in the instance __dict__, or when the type uses object.__setattr__. Otherwise fall back to the value from getattr(), as before.
pytest 9.2.0.dev345+g872117358, Python 3.13.5, Windows 11.
- Vorherrschende Sprache
- Python
- Sterne
- 14.7k
- Forks
- 3.6k
- Ø Merge
- 2 T. 5 Std.
- Gemergte PRs (30 T.)
- 35
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus pytest-dev/pytest
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 64/100
pytest-dev/pytest#15337 ·
Maintainer antworten meist innerhalb von 1 Tag
-
pytest.approx with a list expected value reports overflowing differences for numpy integer arraysEvtl. vergeben @rinopatrick hat das vor 3 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
pytest-dev/pytest#15314 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
Logging capture crashes when another thread registers a loggerEvtl. vergeben @Spikhalskiy hat das vor 14 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
pytest-dev/pytest#15237 ·
Maintainer antworten meist innerhalb von 1 Tag
-
`faulthandler_timeout` stops covering a test once setup, call or a subtest fails (`pytest_exception_interact` cancels the timer)Evtl. vergeben @mayur-dhavan hat das vor 10 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
pytest-dev/pytest#15180 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
Allow dotted test filenames (`*.test.py`) via one-line change to `compute_module_name`Evtl. wieder frei @siddy-stack hat das vor 79 Tagen übernommen, und es ist kein Pull Request offen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100
pytest-dev/pytest#14514 · 6 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in pytest-dev/pytest
Ähnliche Issues
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
Maintainer antworten meist innerhalb von 1 Tag
-
area:docs documentation effort:M ready-for-agent
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
mczielinski/ob-analytics#423 ·
Maintainer antworten meist innerhalb von 1 Tag
-
infra
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 3 Tagen
-
documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
vllm-project/vllm-ascend#21033 ·
Maintainer antworten meist innerhalb von 1 Tag