From da7c0ddd50c7c9a557f24daed1a3d813c5b8fd8a Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Sun, 23 Aug 2020 17:02:25 +0200 Subject: [PATCH] Shorter property deprecation. This lets us write deprecated properties with single-line lambdas, which is quite a bit more compact (as shown by the line diff). --- lib/matplotlib/_mathtext.py | 10 +-- lib/matplotlib/animation.py | 7 +- lib/matplotlib/backend_bases.py | 8 +- lib/matplotlib/backends/backend_cairo.py | 71 +++++++-------- lib/matplotlib/backends/backend_gtk3.py | 8 +- lib/matplotlib/backends/backend_pgf.py | 6 +- lib/matplotlib/backends/backend_ps.py | 15 ++-- lib/matplotlib/cbook/deprecation.py | 25 +++--- lib/matplotlib/contour.py | 7 +- lib/matplotlib/texmanager.py | 45 +++------- lib/matplotlib/widgets.py | 110 ++++++++--------------- lib/mpl_toolkits/mplot3d/axes3d.py | 20 ++--- 12 files changed, 121 insertions(+), 211 deletions(-) diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index 33c3537de17a..85dc0d502694 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -805,10 +805,7 @@ def __init__(self, default_font_prop, mathtext_backend=None): self.fonts['default'] = default_font self.fonts['regular'] = default_font - @cbook.deprecated("3.4") - @property - def pswriter(self): - return StringIO() + pswriter = cbook.deprecated("3.4")(property(lambda self: StringIO())) def _get_font(self, font): if font in self.fontmap: @@ -1562,10 +1559,7 @@ class Glue(Node): it's easier to stick to what TeX does.) """ - @cbook.deprecated("3.3") - @property - def glue_subtype(self): - return "normal" + glue_subtype = cbook.deprecated("3.3")(property(lambda self: "normal")) @cbook._delete_parameter("3.3", "copy") def __init__(self, glue_type, copy=False): diff --git a/lib/matplotlib/animation.py b/lib/matplotlib/animation.py index cd72921395de..4edeb05ae4bc 100644 --- a/lib/matplotlib/animation.py +++ b/lib/matplotlib/animation.py @@ -778,11 +778,8 @@ class HTMLWriter(FileMovieWriter): """Writer for JavaScript-based HTML movies.""" supported_formats = ['png', 'jpeg', 'tiff', 'svg'] - - @cbook.deprecated("3.3") - @property - def args_key(self): - return 'animation.html_args' + args_key = cbook.deprecated("3.3")(property( + lambda self: 'animation.html_args')) @classmethod def isAvailable(cls): diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index a239660e082a..3f163fbe43da 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -2709,6 +2709,9 @@ class FigureManagerBase: figure.canvas.mpl_disconnect( figure.canvas.manager.button_press_handler_id) """ + + statusbar = cbook.deprecated("3.3")(property(lambda self: None)) + def __init__(self, canvas, num): self.canvas = canvas canvas.manager = self # store a pointer to parent @@ -2735,11 +2738,6 @@ def notify_axes_change(fig): if self.toolmanager is None and self.toolbar is not None: self.toolbar.update() - @cbook.deprecated("3.3") - @property - def statusbar(self): - return None - def show(self): """ For GUI backends, show the figure window and redraw. diff --git a/lib/matplotlib/backends/backend_cairo.py b/lib/matplotlib/backends/backend_cairo.py index 756d88009121..ced62715dd6a 100644 --- a/lib/matplotlib/backends/backend_cairo.py +++ b/lib/matplotlib/backends/backend_cairo.py @@ -91,40 +91,40 @@ def attr(field): return name, slant, weight +# Mappings used for deprecated properties in RendererCairo, see below. +_f_weights = { + 100: cairo.FONT_WEIGHT_NORMAL, + 200: cairo.FONT_WEIGHT_NORMAL, + 300: cairo.FONT_WEIGHT_NORMAL, + 400: cairo.FONT_WEIGHT_NORMAL, + 500: cairo.FONT_WEIGHT_NORMAL, + 600: cairo.FONT_WEIGHT_BOLD, + 700: cairo.FONT_WEIGHT_BOLD, + 800: cairo.FONT_WEIGHT_BOLD, + 900: cairo.FONT_WEIGHT_BOLD, + 'ultralight': cairo.FONT_WEIGHT_NORMAL, + 'light': cairo.FONT_WEIGHT_NORMAL, + 'normal': cairo.FONT_WEIGHT_NORMAL, + 'medium': cairo.FONT_WEIGHT_NORMAL, + 'regular': cairo.FONT_WEIGHT_NORMAL, + 'semibold': cairo.FONT_WEIGHT_BOLD, + 'bold': cairo.FONT_WEIGHT_BOLD, + 'heavy': cairo.FONT_WEIGHT_BOLD, + 'ultrabold': cairo.FONT_WEIGHT_BOLD, + 'black': cairo.FONT_WEIGHT_BOLD, +} +_f_angles = { + 'italic': cairo.FONT_SLANT_ITALIC, + 'normal': cairo.FONT_SLANT_NORMAL, + 'oblique': cairo.FONT_SLANT_OBLIQUE, +} + + class RendererCairo(RendererBase): - @cbook.deprecated("3.3") - @property - def fontweights(self): - return { - 100: cairo.FONT_WEIGHT_NORMAL, - 200: cairo.FONT_WEIGHT_NORMAL, - 300: cairo.FONT_WEIGHT_NORMAL, - 400: cairo.FONT_WEIGHT_NORMAL, - 500: cairo.FONT_WEIGHT_NORMAL, - 600: cairo.FONT_WEIGHT_BOLD, - 700: cairo.FONT_WEIGHT_BOLD, - 800: cairo.FONT_WEIGHT_BOLD, - 900: cairo.FONT_WEIGHT_BOLD, - 'ultralight': cairo.FONT_WEIGHT_NORMAL, - 'light': cairo.FONT_WEIGHT_NORMAL, - 'normal': cairo.FONT_WEIGHT_NORMAL, - 'medium': cairo.FONT_WEIGHT_NORMAL, - 'regular': cairo.FONT_WEIGHT_NORMAL, - 'semibold': cairo.FONT_WEIGHT_BOLD, - 'bold': cairo.FONT_WEIGHT_BOLD, - 'heavy': cairo.FONT_WEIGHT_BOLD, - 'ultrabold': cairo.FONT_WEIGHT_BOLD, - 'black': cairo.FONT_WEIGHT_BOLD, - } - - @cbook.deprecated("3.3") - @property - def fontangles(self): - return { - 'italic': cairo.FONT_SLANT_ITALIC, - 'normal': cairo.FONT_SLANT_NORMAL, - 'oblique': cairo.FONT_SLANT_OBLIQUE, - } + fontweights = cbook.deprecated("3.3")(property(lambda self: {*_f_weights})) + fontangles = cbook.deprecated("3.3")(property(lambda self: {*_f_angles})) + mathtext_parser = cbook.deprecated("3.4")( + property(lambda self: MathTextParser('Cairo'))) def __init__(self, dpi): self.dpi = dpi @@ -133,11 +133,6 @@ def __init__(self, dpi): cairo.ImageSurface(cairo.FORMAT_ARGB32, 1, 1)) super().__init__() - @cbook.deprecated("3.4") - @property - def mathtext_parser(self): - return MathTextParser('Cairo') - def set_ctx_from_surface(self, surface): self.gc.ctx = cairo.Context(surface) # Although it may appear natural to automatically call diff --git a/lib/matplotlib/backends/backend_gtk3.py b/lib/matplotlib/backends/backend_gtk3.py index ae445d19ade1..4652a2d0a9d0 100644 --- a/lib/matplotlib/backends/backend_gtk3.py +++ b/lib/matplotlib/backends/backend_gtk3.py @@ -489,6 +489,9 @@ def resize(self, width, height): class NavigationToolbar2GTK3(NavigationToolbar2, Gtk.Toolbar): + ctx = cbook.deprecated("3.3")(property( + lambda self: self.canvas.get_property("window").cairo_create())) + def __init__(self, canvas, window): self.win = window GObject.GObject.__init__(self) @@ -541,11 +544,6 @@ def __init__(self, canvas, window): NavigationToolbar2.__init__(self, canvas) - @cbook.deprecated("3.3") - @property - def ctx(self): - return self.canvas.get_property("window").cairo_create() - def set_message(self, s): escaped = GLib.markup_escape_text(s) self.message.set_markup(f'{escaped}') diff --git a/lib/matplotlib/backends/backend_pgf.py b/lib/matplotlib/backends/backend_pgf.py index 2288397343a0..769eb66e89ce 100644 --- a/lib/matplotlib/backends/backend_pgf.py +++ b/lib/matplotlib/backends/backend_pgf.py @@ -961,6 +961,7 @@ class PdfPages: '_info_dict', '_metadata', ) + metadata = cbook.deprecated('3.3')(property(lambda self: self._metadata)) def __init__(self, filename, *, keep_empty=True, metadata=None): """ @@ -1006,11 +1007,6 @@ def __init__(self, filename, *, keep_empty=True, metadata=None): self._info_dict = _create_pdf_info_dict('pgf', self._metadata) self._file = BytesIO() - @cbook.deprecated('3.3') - @property - def metadata(self): - return self._metadata - def _write_header(self, width_inches, height_inches): hyperref_options = ','.join( _metadata_to_str(k, v) for k, v in self._info_dict.items()) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 344315d54b88..c462b50c575f 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -223,6 +223,11 @@ class RendererPS(_backend_pdf_ps.RendererPDFPSBase): _afm_font_dir = cbook._get_data_path("fonts/afm") _use_afm_rc_name = "ps.useafm" + mathtext_parser = cbook.deprecated("3.4")(property( + lambda self: MathTextParser("PS"))) + used_characters = cbook.deprecated("3.3")(property( + lambda self: self._character_tracker.used_characters)) + def __init__(self, width, height, pswriter, imagedpi=72): # Although postscript itself is dpi independent, we need to inform the # image code about a requested dpi to generate high resolution images @@ -249,16 +254,6 @@ def __init__(self, width, height, pswriter, imagedpi=72): self._character_tracker = _backend_pdf_ps.CharacterTracker() - @cbook.deprecated("3.3") - @property - def mathtext_parser(self): - return MathTextParser("PS") - - @cbook.deprecated("3.3") - @property - def used_characters(self): - return self._character_tracker.used_characters - @cbook.deprecated("3.3") def track_characters(self, *args, **kwargs): """Keep track of which characters are required from each font.""" diff --git a/lib/matplotlib/cbook/deprecation.py b/lib/matplotlib/cbook/deprecation.py index d84709fb9373..b4f35048f4e3 100644 --- a/lib/matplotlib/cbook/deprecation.py +++ b/lib/matplotlib/cbook/deprecation.py @@ -192,22 +192,24 @@ def finalize(wrapper, new_doc): class _deprecated_property(property): def __get__(self, instance, owner): if instance is not None: - from . import _warn_external - _warn_external(warning) + emit_warning() return super().__get__(instance, owner) def __set__(self, instance, value): if instance is not None: - from . import _warn_external - _warn_external(warning) + emit_warning() return super().__set__(instance, value) def __delete__(self, instance): if instance is not None: - from . import _warn_external - _warn_external(warning) + emit_warning() return super().__delete__(instance) + def __set_name__(self, owner, set_name): + nonlocal name + if name == "": + name = set_name + def finalize(_, new_doc): return _deprecated_property( fget=obj.fget, fset=obj.fset, fdel=obj.fdel, doc=new_doc) @@ -224,13 +226,14 @@ def finalize(wrapper, new_doc): wrapper.__doc__ = new_doc return wrapper - warning = _generate_deprecation_warning( - since, message, name, alternative, pending, obj_type, addendum, - removal=removal) + def emit_warning(): + warn_deprecated( + since, message=message, name=name, alternative=alternative, + pending=pending, obj_type=obj_type, addendum=addendum, + removal=removal) def wrapper(*args, **kwargs): - from . import _warn_external - _warn_external(warning) + emit_warning() return func(*args, **kwargs) old_doc = inspect.cleandoc(old_doc or '').strip('\n') diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index c06621c272c3..26fb199de73b 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -709,6 +709,8 @@ class ContourSet(cm.ScalarMappable, ContourLabeler): %(contour_set_attributes)s """ + ax = cbook.deprecated("3.3")(property(lambda self: self.axes)) + def __init__(self, ax, *args, levels=None, filled=False, linewidths=None, linestyles=None, hatches=(None,), alpha=None, origin=None, extent=None, @@ -907,11 +909,6 @@ def __init__(self, ax, *args, cbook._warn_external('The following kwargs were not used by ' 'contour: ' + s) - @cbook.deprecated("3.3") - @property - def ax(self): - return self.axes - def get_transform(self): """ Return the :class:`~matplotlib.transforms.Transform` diff --git a/lib/matplotlib/texmanager.py b/lib/matplotlib/texmanager.py index 254a36fb8e34..a64938432b2b 100644 --- a/lib/matplotlib/texmanager.py +++ b/lib/matplotlib/texmanager.py @@ -80,43 +80,26 @@ class TexManager: 'computer modern sans serif': ('cmss', r'\usepackage{type1ec}'), 'computer modern typewriter': ('cmtt', r'\usepackage{type1ec}')} - @cbook.deprecated("3.3", alternative="matplotlib.get_cachedir()") - @property - def cachedir(self): - return mpl.get_cachedir() - - @cbook.deprecated("3.3") - @property - def rgba_arrayd(self): - return {} + cachedir = cbook.deprecated( + "3.3", alternative="matplotlib.get_cachedir()")( + property(lambda self: mpl.get_cachedir())) + rgba_arrayd = cbook.deprecated("3.3")(property(lambda self: {})) + _fonts = {} # Only for deprecation period. + serif = cbook.deprecated("3.3")(property( + lambda self: self._fonts.get("serif", ('cmr', '')))) + sans_serif = cbook.deprecated("3.3")(property( + lambda self: self._fonts.get("sans-serif", ('cmss', '')))) + cursive = cbook.deprecated("3.3")(property( + lambda self: + self._fonts.get("cursive", ('pzc', r'\usepackage{chancery}')))) + monospace = cbook.deprecated("3.3")(property( + lambda self: self._fonts.get("monospace", ('cmtt', '')))) @functools.lru_cache() # Always return the same instance. def __new__(cls): Path(cls.texcache).mkdir(parents=True, exist_ok=True) return object.__new__(cls) - _fonts = {} # Only for deprecation period. - - @cbook.deprecated("3.3") - @property - def serif(self): - return self._fonts.get("serif", ('cmr', '')) - - @cbook.deprecated("3.3") - @property - def sans_serif(self): - return self._fonts.get("sans-serif", ('cmss', '')) - - @cbook.deprecated("3.3") - @property - def cursive(self): - return self._fonts.get("cursive", ('pzc', r'\usepackage{chancery}')) - - @cbook.deprecated("3.3") - @property - def monospace(self): - return self._fonts.get("monospace", ('cmtt', '')) - def get_font_config(self): ff = rcParams['font.family'] if len(ff) == 1 and ff[0].lower() in self.font_families: diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index 8336d6353b62..01f93de8bd57 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -108,16 +108,14 @@ class AxesWidget(Widget): active : bool If False, the widget does not respond to events. """ + + cids = cbook.deprecated("3.4")(property(lambda self: self._cids)) + def __init__(self, ax): self.ax = ax self.canvas = ax.figure.canvas self._cids = [] - @cbook.deprecated("3.4") - @property - def cids(self): - return self._cids - def connect_event(self, event, callback): """ Connect callback with an event. @@ -153,6 +151,11 @@ class Button(AxesWidget): The color of the button when hovering. """ + cnt = cbook.deprecated("3.4")(property( # Not real, but close enough. + lambda self: len(self._observers.callbacks['clicked']))) + observers = cbook.deprecated("3.4")(property( + lambda self: self._observers.callbacks['clicked'])) + def __init__(self, ax, label, image=None, color='0.85', hovercolor='0.95'): """ @@ -191,17 +194,6 @@ def __init__(self, ax, label, image=None, self.color = color self.hovercolor = hovercolor - @cbook.deprecated("3.4") - @property - def cnt(self): - # Not real, but close enough. - return len(self._observers.callbacks['clicked']) - - @cbook.deprecated("3.4") - @property - def observers(self): - return self._observers.callbacks['clicked'] - def _click(self, event): if self.ignore(event) or event.inaxes != self.ax or not self.eventson: return @@ -251,6 +243,11 @@ class Slider(AxesWidget): Slider value. """ + cnt = cbook.deprecated("3.4")(property( # Not real, but close enough. + lambda self: len(self._observers.callbacks['changed']))) + observers = cbook.deprecated("3.4")(property( + lambda self: self._observers.callbacks['changed'])) + def __init__(self, ax, label, valmin, valmax, valinit=0.5, valfmt=None, closedmin=True, closedmax=True, slidermin=None, slidermax=None, dragging=True, valstep=None, @@ -387,17 +384,6 @@ def __init__(self, ax, label, valmin, valmax, valinit=0.5, valfmt=None, self.set_val(valinit) - @cbook.deprecated("3.4") - @property - def cnt(self): - # Not real, but close enough. - return len(self._observers.callbacks['changed']) - - @cbook.deprecated("3.4") - @property - def observers(self): - return self._observers.callbacks['changed'] - def _value_in_bounds(self, val): """Makes sure *val* is with given bounds.""" if self.valstep: @@ -538,6 +524,11 @@ class CheckButtons(AxesWidget): each box, but have ``set_visible(False)`` when its box is not checked. """ + cnt = cbook.deprecated("3.4")(property( # Not real, but close enough. + lambda self: len(self._observers.callbacks['clicked']))) + observers = cbook.deprecated("3.4")(property( + lambda self: self._observers.callbacks['clicked'])) + def __init__(self, ax, labels, actives=None): """ Add check buttons to `matplotlib.axes.Axes` instance *ax* @@ -605,17 +596,6 @@ def __init__(self, ax, labels, actives=None): self._observers = cbook.CallbackRegistry() - @cbook.deprecated("3.4") - @property - def cnt(self): - # Not real, but close enough. - return len(self._observers.callbacks['clicked']) - - @cbook.deprecated("3.4") - @property - def observers(self): - return self._observers.callbacks['clicked'] - def _clicked(self, event): if self.ignore(event) or event.button != 1 or event.inaxes != self.ax: return @@ -696,10 +676,14 @@ class TextBox(AxesWidget): The color of the text box when hovering. """ - @cbook.deprecated("3.3") - @property - def params_to_disable(self): - return [key for key in mpl.rcParams if 'keymap' in key] + params_to_disable = cbook.deprecated("3.3")(property( + lambda self: [key for key in mpl.rcParams if 'keymap' in key])) + cnt = cbook.deprecated("3.4")(property( # Not real, but close enough. + lambda self: sum(len(d) for d in self._observers.callbacks.values()))) + change_observers = cbook.deprecated("3.4")(property( + lambda self: self._observers.callbacks['change'])) + submit_observers = cbook.deprecated("3.4")(property( + lambda self: self._observers.callbacks['submit'])) def __init__(self, ax, label, initial='', color='.95', hovercolor='1', label_pad=.01): @@ -753,22 +737,6 @@ def __init__(self, ax, label, initial='', self.capturekeystrokes = False - @cbook.deprecated("3.4") - @property - def cnt(self): - # Not real, but close enough. - return sum(len(d) for d in self._observers.callbacks.values()) - - @cbook.deprecated("3.4") - @property - def change_observers(self): - return self._observers.callbacks['change'] - - @cbook.deprecated("3.4") - @property - def submit_observers(self): - return self._observers.callbacks['submit'] - @property def text(self): return self.text_disp.get_text() @@ -1025,16 +993,10 @@ def __init__(self, ax, labels, active=0, activecolor='blue'): self._observers = cbook.CallbackRegistry() - @cbook.deprecated("3.4") - @property - def cnt(self): - # Not real, but close enough. - return len(self._observers.callbacks['clicked']) - - @cbook.deprecated("3.4") - @property - def observers(self): - return self._observers.callbacks['clicked'] + cnt = cbook.deprecated("3.4")(property( # Not real, but close enough. + lambda self: len(self._observers.callbacks['clicked']))) + observers = cbook.deprecated("3.4")(property( + lambda self: self._observers.callbacks['clicked'])) def _clicked(self, event): if self.ignore(event) or event.button != 1 or event.inaxes != self.ax: @@ -1159,17 +1121,17 @@ def _on_reset(self, event): event.canvas.draw() self.targetfig.canvas.draw() - axleft = cbook.deprecated("3.3", name="axleft")( + axleft = cbook.deprecated("3.3")( property(lambda self: self.sliderleft.ax)) - axright = cbook.deprecated("3.3", name="axright")( + axright = cbook.deprecated("3.3")( property(lambda self: self.sliderright.ax)) - axbottom = cbook.deprecated("3.3", name="axbottom")( + axbottom = cbook.deprecated("3.3")( property(lambda self: self.sliderbottom.ax)) - axtop = cbook.deprecated("3.3", name="axtop")( + axtop = cbook.deprecated("3.3")( property(lambda self: self.slidertop.ax)) - axwspace = cbook.deprecated("3.3", name="axwspace")( + axwspace = cbook.deprecated("3.3")( property(lambda self: self.sliderwspace.ax)) - axhspace = cbook.deprecated("3.3", name="axhspace")( + axhspace = cbook.deprecated("3.3")( property(lambda self: self.sliderhspace.ax)) @cbook.deprecated("3.3") diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 421e37ed78da..37821a4290c3 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -184,20 +184,12 @@ def get_zaxis(self): get_zgridlines = _axis_method_wrapper("zaxis", "get_gridlines") get_zticklines = _axis_method_wrapper("zaxis", "get_ticklines") - @cbook.deprecated("3.1", alternative="xaxis", pending=True) - @property - def w_xaxis(self): - return self.xaxis - - @cbook.deprecated("3.1", alternative="yaxis", pending=True) - @property - def w_yaxis(self): - return self.yaxis - - @cbook.deprecated("3.1", alternative="zaxis", pending=True) - @property - def w_zaxis(self): - return self.zaxis + w_xaxis = cbook.deprecated("3.1", alternative="xaxis", pending=True)( + property(lambda self: self.xaxis)) + w_yaxis = cbook.deprecated("3.1", alternative="yaxis", pending=True)( + property(lambda self: self.yaxis)) + w_zaxis = cbook.deprecated("3.1", alternative="zaxis", pending=True)( + property(lambda self: self.zaxis)) def _get_axis_list(self): return super()._get_axis_list() + (self.zaxis, )