@@ -104,7 +104,6 @@ def _copy_docstring_and_deprecators(method, func=None):
104104
105105## Global ##
106106
107-
108107_IP_REGISTERED = None
109108_INSTALL_FIG_OBSERVER = False
110109
@@ -207,6 +206,28 @@ def _get_required_interactive_framework(backend_mod):
207206 # Inline this once the deprecation elapses.
208207 return backend_mod .FigureCanvas .required_interactive_framework
209208
209+ _backend_mod = None
210+
211+
212+ def _get_backend_mod ():
213+ """
214+ Ensure that a backend is selected and return it.
215+
216+ This is currently private, but may be made public in the future.
217+ """
218+ if _backend_mod is None :
219+ # Use __getitem__ here to avoid going through the fallback logic (which
220+ # will (re)import pyplot and then call switch_backend if we need to
221+ # resolve the auto sentinel)
222+ switch_backend (dict .__getitem__ (rcParams , "backend" ))
223+ # Just to be safe. Interactive mode can be turned on without calling
224+ # `plt.ion()` so register it again here. This is safe because multiple
225+ # calls to `install_repl_displayhook` are no-ops and the registered
226+ # function respects `mpl.is_interactive()` to determine if it should
227+ # trigger a draw.
228+ install_repl_displayhook ()
229+ return _backend_mod
230+
210231
211232def switch_backend (newbackend ):
212233 """
@@ -297,7 +318,7 @@ class backend_mod(matplotlib.backend_bases._Backend):
297318
298319
299320def _warn_if_gui_out_of_main_thread ():
300- if (_get_required_interactive_framework (_backend_mod )
321+ if (_get_required_interactive_framework (_get_backend_mod () )
301322 and threading .current_thread () is not threading .main_thread ()):
302323 _api .warn_external (
303324 "Starting a Matplotlib GUI outside of the main thread will likely "
@@ -308,7 +329,7 @@ def _warn_if_gui_out_of_main_thread():
308329def new_figure_manager (* args , ** kwargs ):
309330 """Create a new figure manager instance."""
310331 _warn_if_gui_out_of_main_thread ()
311- return _backend_mod .new_figure_manager (* args , ** kwargs )
332+ return _get_backend_mod () .new_figure_manager (* args , ** kwargs )
312333
313334
314335# This function's signature is rewritten upon backend-load by switch_backend.
@@ -321,7 +342,7 @@ def draw_if_interactive(*args, **kwargs):
321342 End users will typically not have to call this function because the
322343 the interactive mode takes care of this.
323344 """
324- return _backend_mod .draw_if_interactive (* args , ** kwargs )
345+ return _get_backend_mod () .draw_if_interactive (* args , ** kwargs )
325346
326347
327348# This function's signature is rewritten upon backend-load by switch_backend.
@@ -370,7 +391,7 @@ def show(*args, **kwargs):
370391 explicitly there.
371392 """
372393 _warn_if_gui_out_of_main_thread ()
373- return _backend_mod .show (* args , ** kwargs )
394+ return _get_backend_mod () .show (* args , ** kwargs )
374395
375396
376397def isinteractive ():
@@ -2226,15 +2247,6 @@ def polar(*args, **kwargs):
22262247 set (_interactive_bk ) - {'WebAgg' , 'nbAgg' })
22272248 and cbook ._get_running_interactive_framework ()):
22282249 dict .__setitem__ (rcParams , "backend" , rcsetup ._auto_backend_sentinel )
2229- # Set up the backend.
2230- switch_backend (rcParams ["backend" ])
2231-
2232- # Just to be safe. Interactive mode can be turned on without
2233- # calling `plt.ion()` so register it again here.
2234- # This is safe because multiple calls to `install_repl_displayhook`
2235- # are no-ops and the registered function respect `mpl.is_interactive()`
2236- # to determine if they should trigger a draw.
2237- install_repl_displayhook ()
22382250
22392251
22402252################# REMAINING CONTENT GENERATED BY boilerplate.py ##############
0 commit comments