Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 436eb4a

Browse files
authored
Merge pull request #16063 from anntzer/drawsig
Make the signature of Axes.draw() consistent with Artist.draw().
2 parents a57c9a1 + 10320b9 commit 436eb4a

File tree

6 files changed

+74
-22
lines changed

6 files changed

+74
-22
lines changed

doc/api/next_api_changes/deprecations.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,3 +247,15 @@ mathtext glues
247247
~~~~~~~~~~~~~~
248248
The *copy* parameter of ``mathtext.Glue`` is deprecated (the underlying glue
249249
spec is now immutable). ``mathtext.GlueSpec`` is deprecated.
250+
251+
Signatures of `.Artist.draw` and `.Axes.draw`
252+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
253+
The *inframe* parameter to `.Axes.draw` is deprecated. Use
254+
`.Axes.redraw_in_frame` instead.
255+
256+
Not passing the *renderer* parameter to `.Axes.draw` is deprecated. Use
257+
``axes.draw_artist(axes)`` instead.
258+
259+
These changes make the signature of the ``draw`` (``artist.draw(renderer)``)
260+
method consistent across all artists; thus, additional parameters to
261+
`.Artist.draw` are deprecated.

lib/matplotlib/artist.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ def allow_rasterization(draw):
2626
renderer.
2727
"""
2828

29-
# the axes class has a second argument inframe for its draw method.
29+
# Axes has a second (deprecated) argument inframe for its draw method.
30+
# args and kwargs are deprecated, but we don't wrap this in
31+
# cbook._delete_parameter for performance; the relevant deprecation
32+
# warning will be emitted by the inner draw() call.
3033
@wraps(draw)
3134
def draw_wrapper(artist, renderer, *args, **kwargs):
3235
try:
@@ -895,6 +898,8 @@ def set_agg_filter(self, filter_func):
895898
self._agg_filter = filter_func
896899
self.stale = True
897900

901+
@cbook._delete_parameter("3.3", "args")
902+
@cbook._delete_parameter("3.3", "kwargs")
898903
def draw(self, renderer, *args, **kwargs):
899904
"""
900905
Draw the Artist (and its children) using the given renderer.

lib/matplotlib/axes/_base.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from collections import OrderedDict
2+
from contextlib import ExitStack
23
import itertools
34
import logging
45
import math
@@ -2618,9 +2619,16 @@ def _update_title_position(self, renderer):
26182619

26192620
# Drawing
26202621
@martist.allow_rasterization
2622+
@cbook._delete_parameter(
2623+
"3.3", "inframe", alternative="Axes.redraw_in_frame()")
26212624
def draw(self, renderer=None, inframe=False):
26222625
# docstring inherited
26232626
if renderer is None:
2627+
cbook.warn_deprecated(
2628+
"3.3", message="Support for not passing the 'renderer' "
2629+
"parameter to Axes.draw() is deprecated since %(since)s and "
2630+
"will be removed %(removal)s. Use axes.draw_artist(axes) "
2631+
"instead.")
26242632
renderer = self.figure._cachedRenderer
26252633
if renderer is None:
26262634
raise RuntimeError('No renderer defined')
@@ -2701,7 +2709,7 @@ def draw_artist(self, a):
27012709
"""
27022710
This method can only be used after an initial draw which
27032711
caches the renderer. It is used to efficiently update Axes
2704-
data (axis ticks, labels, etc are not updated)
2712+
data (axis ticks, labels, etc are not updated).
27052713
"""
27062714
if self.figure._cachedRenderer is None:
27072715
raise AttributeError("draw_artist can only be used after an "
@@ -2712,12 +2720,17 @@ def redraw_in_frame(self):
27122720
"""
27132721
This method can only be used after an initial draw which
27142722
caches the renderer. It is used to efficiently update Axes
2715-
data (axis ticks, labels, etc are not updated)
2723+
data (axis ticks, labels, etc are not updated).
27162724
"""
27172725
if self.figure._cachedRenderer is None:
27182726
raise AttributeError("redraw_in_frame can only be used after an "
27192727
"initial draw which caches the renderer")
2720-
self.draw(self.figure._cachedRenderer, inframe=True)
2728+
with ExitStack() as stack:
2729+
for artist in [*self._get_axis_list(),
2730+
self.title, self._left_title, self._right_title]:
2731+
stack.push(artist.set_visible, artist.get_visible())
2732+
artist.set_visible(False)
2733+
self.draw(self.figure._cachedRenderer)
27212734

27222735
def get_renderer_cache(self):
27232736
return self.figure._cachedRenderer

lib/matplotlib/axes/_secondary_axes.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,9 @@ def set_functions(self, functions):
203203
'and the second being the inverse')
204204
self._set_scale()
205205

206-
def draw(self, renderer=None, inframe=False):
206+
# Should be changed to draw(self, renderer) once the deprecation of
207+
# renderer=None and of inframe expires.
208+
def draw(self, *args, **kwargs):
207209
"""
208210
Draw the secondary axes.
209211
@@ -215,7 +217,7 @@ def draw(self, renderer=None, inframe=False):
215217
self._set_lims()
216218
# this sets the scale in case the parent has set its scale.
217219
self._set_scale()
218-
super().draw(renderer=renderer, inframe=inframe)
220+
super().draw(*args, **kwargs)
219221

220222
def _set_scale(self):
221223
"""

lib/matplotlib/cbook/deprecation.py

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ def __repr__(self):
307307
_deprecated_parameter = _deprecated_parameter_class()
308308

309309

310-
def _delete_parameter(since, name, func=None):
310+
def _delete_parameter(since, name, func=None, **kwargs):
311311
"""
312312
Decorator indicating that parameter *name* of *func* is being deprecated.
313313
@@ -320,6 +320,8 @@ def _delete_parameter(since, name, func=None):
320320
such after the deprecation period has passed and the deprecated parameter
321321
is removed.
322322
323+
Additional keyword arguments are passed to `.warn_deprecated`.
324+
323325
Examples
324326
--------
325327
::
@@ -329,29 +331,45 @@ def func(used_arg, other_arg, unused, more_args): ...
329331
"""
330332

331333
if func is None:
332-
return functools.partial(_delete_parameter, since, name)
334+
return functools.partial(_delete_parameter, since, name, **kwargs)
333335

334336
signature = inspect.signature(func)
335337
assert name in signature.parameters, (
336338
f"Matplotlib internal error: {name!r} must be a parameter for "
337339
f"{func.__name__}()")
338-
func.__signature__ = signature.replace(parameters=[
339-
param.replace(default=_deprecated_parameter) if param.name == name
340-
else param
341-
for param in signature.parameters.values()])
340+
kind = signature.parameters[name].kind
341+
is_varargs = kind is inspect.Parameter.VAR_POSITIONAL
342+
is_varkwargs = kind is inspect.Parameter.VAR_KEYWORD
343+
if not is_varargs and not is_varkwargs:
344+
func.__signature__ = signature = signature.replace(parameters=[
345+
param.replace(default=_deprecated_parameter) if param.name == name
346+
else param
347+
for param in signature.parameters.values()])
342348

343349
@functools.wraps(func)
344-
def wrapper(*args, **kwargs):
345-
arguments = func.__signature__.bind(*args, **kwargs).arguments
350+
def wrapper(*inner_args, **inner_kwargs):
351+
arguments = signature.bind(*inner_args, **inner_kwargs).arguments
352+
if is_varargs and arguments.get(name):
353+
warn_deprecated(
354+
since, message=f"Additional positional arguments to "
355+
f"{func.__name__}() are deprecated since %(since)s and "
356+
f"support for them will be removed %(removal)s.")
357+
elif is_varkwargs and arguments.get(name):
358+
warn_deprecated(
359+
since, message=f"Additional keyword arguments to "
360+
f"{func.__name__}() are deprecated since %(since)s and "
361+
f"support for them will be removed %(removal)s.")
346362
# We cannot just check `name not in arguments` because the pyplot
347363
# wrappers always pass all arguments explicitly.
348-
if name in arguments and arguments[name] != _deprecated_parameter:
364+
elif name in arguments and arguments[name] != _deprecated_parameter:
349365
warn_deprecated(
350-
since, message=f"The {name!r} parameter of {func.__name__}() "
351-
f"is deprecated since Matplotlib {since} and will be removed "
352-
f"%(removal)s. If any parameter follows {name!r}, they "
353-
f"should be pass as keyword, not positionally.")
354-
return func(*args, **kwargs)
366+
since,
367+
name=repr(name),
368+
obj_type=f"parameter of {func.__name__}()",
369+
addendum=(f"If any parameter follows {name!r}, they should be "
370+
f"passed as keyword, not positionally."),
371+
**kwargs)
372+
return func(*inner_args, **inner_kwargs)
355373

356374
return wrapper
357375

lib/matplotlib/projections/polar.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -895,7 +895,9 @@ def get_yaxis_text2_transform(self, pad):
895895
pad_shift = _ThetaShift(self, pad, 'min')
896896
return self._yaxis_text_transform + pad_shift, 'center', halign
897897

898-
def draw(self, *args, **kwargs):
898+
@cbook._delete_parameter("3.3", "args")
899+
@cbook._delete_parameter("3.3", "kwargs")
900+
def draw(self, renderer, *args, **kwargs):
899901
thetamin, thetamax = np.rad2deg(self._realViewLim.intervalx)
900902
if thetamin > thetamax:
901903
thetamin, thetamax = thetamax, thetamin
@@ -938,7 +940,7 @@ def draw(self, *args, **kwargs):
938940
self.yaxis.reset_ticks()
939941
self.yaxis.set_clip_path(self.patch)
940942

941-
Axes.draw(self, *args, **kwargs)
943+
Axes.draw(self, renderer, *args, **kwargs)
942944

943945
def _gen_axes_patch(self):
944946
return mpatches.Wedge((0.5, 0.5), 0.5, 0.0, 360.0)

0 commit comments

Comments
 (0)