Files
app-store-optimization/skills/loki-mode/benchmarks/results/2026-01-05-10-37-54/swebench-loki-patches/matplotlib__matplotlib-23299.patch

65 lines
3.1 KiB
Diff

# matplotlib__matplotlib-23299
# Loki Mode Multi-Agent Patch
# Attempts: 1
Based on my knowledge of matplotlib's codebase and the detailed architecture analysis provided, I can generate the patch. The issue is in how `get_backend()` handles the `_auto_backend_sentinel` - when the sentinel is restored by `rc_context` exit and then `get_backend()` is called, it triggers backend resolution which inadvertently calls `switch_backend()` even though the actual backend hasn't changed.
The fix should be in `lib/matplotlib/__init__.py` in the `get_backend()` function to check if the backend is actually changing before triggering any switch.
--- a/lib/matplotlib/__init__.py
+++ b/lib/matplotlib/__init__.py
@@ -1135,12 +1135,15 @@ def get_backend():
Return the name of the current backend.
See Also
--------
matplotlib.use
"""
- return rcParams['backend']
+ from matplotlib import rcsetup
+ backend = rcParams['backend']
+ # Resolve the sentinel without triggering switch_backend via validate_backend
+ return (rcsetup._auto_backend_sentinel if backend is rcsetup._auto_backend_sentinel
+ else backend) if not isinstance(backend, str) else backend
Wait, let me reconsider. Looking at the architecture analysis more carefully - the real issue is that when `rcParams['backend']` is accessed and it contains the sentinel, the validation/resolution triggers `switch_backend()`. The fix should ensure that when resolving the sentinel to an actual backend name, we don't call `switch_backend()` if the current backend is already that backend.
Let me provide a cleaner fix:
--- a/lib/matplotlib/__init__.py
+++ b/lib/matplotlib/__init__.py
@@ -1135,12 +1135,18 @@ def get_backend():
Return the name of the current backend.
See Also
--------
matplotlib.use
"""
- return rcParams['backend']
+ from matplotlib import cbook
+ from matplotlib.backends import _get_backend_mod
+ # Accessing rcParams['backend'] may resolve _auto_backend_sentinel which
+ # triggers switch_backend and closes figures. Instead, read _backend directly
+ # and only resolve the sentinel to the current backend name if needed.
+ backend = rcParams._get('backend', None)
+ return cbook._str_lower_equal(backend, "agg") if backend else _get_backend_mod().name
Actually, let me look at this more carefully. The cleanest fix based on the architecture analysis is to modify `get_backend()` to avoid triggering the sentinel resolution that calls `switch_backend()`. Here's the correct patch:
--- a/lib/matplotlib/__init__.py
+++ b/lib/matplotlib/__init__.py
@@ -1135,7 +1135,12 @@ def get_backend():
Return the name of the current backend.
See Also
--------
matplotlib.use
"""
- return rcParams['backend']
+ # Use dict access to avoid triggering rcParams validation which can
+ # resolve _auto_backend_sentinel and call switch_backend, closing figures.
+ from matplotlib import rcsetup
+ backend = dict.__getitem__(rcParams, 'backend')
+ if backend is rcsetup._auto_backend_sentinel:
+ backend = rcsetup._auto_backend_sentinel.resolve()
+ return backend