Skip to content

Commit 4391fe9

Browse files
authored
Merge pull request #10697 from anntzer/remove-method
Remove special-casing of _remove_method when pickling.
2 parents 51cc3f1 + bde55a0 commit 4391fe9

File tree

7 files changed

+37
-49
lines changed

7 files changed

+37
-49
lines changed

doc/api/next_api_changes/2018-02-15-AL-deprecations.rst

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ Deprecations
22
````````````
33
The following modules are deprecated:
44

5-
- :mod:`matplotlib.compat.subprocess`. This was a python 2 workaround, but all the
6-
functionality can now be found in the python 3 standard library
5+
- :mod:`matplotlib.compat.subprocess`. This was a python 2 workaround, but all
6+
the functionality can now be found in the python 3 standard library
77
:mod:`subprocess`.
88

9-
The following functions and classes are deprecated:
9+
The following classes, methods, and functions are deprecated:
1010

1111
- ``cbook.GetRealpathAndStat`` (which is only a helper for
1212
``get_realpath_and_stat``),
1313
- ``cbook.Locked``,
1414
- ``cbook.is_numlike`` (use ``isinstance(..., numbers.Number)`` instead),
15+
- ``container.Container.set_remove_method``,
1516
- ``mathtext.unichr_safe`` (use ``chr`` instead),
1617
- ``texmanager.dvipng_hack_alpha``,
1718

lib/matplotlib/artist.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ def __getstate__(self):
124124
d = self.__dict__.copy()
125125
# remove the unpicklable remove method, this will get re-added on load
126126
# (by the axes) if the artist lives on an axes.
127-
d['_remove_method'] = None
128127
d['stale_callback'] = None
129128
return d
130129

lib/matplotlib/axes/_axes.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,9 +554,12 @@ def legend(self, *args, **kwargs):
554554
if len(extra_args):
555555
raise TypeError('legend only accepts two non-keyword arguments')
556556
self.legend_ = mlegend.Legend(self, handles, labels, **kwargs)
557-
self.legend_._remove_method = lambda h: setattr(self, 'legend_', None)
557+
self.legend_._remove_method = self._remove_legend
558558
return self.legend_
559559

560+
def _remove_legend(self, legend):
561+
self.legend_ = None
562+
560563
def text(self, x, y, s, fontdict=None, withdash=False, **kwargs):
561564
"""
562565
Add text to the axes.

lib/matplotlib/axes/_base.py

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -586,12 +586,6 @@ def __getstate__(self):
586586

587587
def __setstate__(self, state):
588588
self.__dict__ = state
589-
# put the _remove_method back on all artists contained within the axes
590-
for container_name in ['lines', 'collections', 'tables', 'patches',
591-
'texts', 'images']:
592-
container = getattr(self, container_name)
593-
for artist in container:
594-
artist._remove_method = container.remove
595589
self._stale = True
596590
self._layoutbox = None
597591
self._poslayoutbox = None
@@ -1858,9 +1852,9 @@ def add_artist(self, a):
18581852
"""
18591853
a.axes = self
18601854
self.artists.append(a)
1855+
a._remove_method = self.artists.remove
18611856
self._set_artist_props(a)
18621857
a.set_clip_path(self.patch)
1863-
a._remove_method = lambda h: self.artists.remove(h)
18641858
self.stale = True
18651859
return a
18661860

@@ -1875,6 +1869,7 @@ def add_collection(self, collection, autolim=True):
18751869
if not label:
18761870
collection.set_label('_collection%d' % len(self.collections))
18771871
self.collections.append(collection)
1872+
collection._remove_method = self.collections.remove
18781873
self._set_artist_props(collection)
18791874

18801875
if collection.get_clip_path() is None:
@@ -1883,7 +1878,6 @@ def add_collection(self, collection, autolim=True):
18831878
if autolim:
18841879
self.update_datalim(collection.get_datalim(self.transData))
18851880

1886-
collection._remove_method = lambda h: self.collections.remove(h)
18871881
self.stale = True
18881882
return collection
18891883

@@ -1897,7 +1891,7 @@ def add_image(self, image):
18971891
if not image.get_label():
18981892
image.set_label('_image%d' % len(self.images))
18991893
self.images.append(image)
1900-
image._remove_method = lambda h: self.images.remove(h)
1894+
image._remove_method = self.images.remove
19011895
self.stale = True
19021896
return image
19031897

@@ -1920,7 +1914,7 @@ def add_line(self, line):
19201914
if not line.get_label():
19211915
line.set_label('_line%d' % len(self.lines))
19221916
self.lines.append(line)
1923-
line._remove_method = lambda h: self.lines.remove(h)
1917+
line._remove_method = self.lines.remove
19241918
self.stale = True
19251919
return line
19261920

@@ -1930,7 +1924,7 @@ def _add_text(self, txt):
19301924
"""
19311925
self._set_artist_props(txt)
19321926
self.texts.append(txt)
1933-
txt._remove_method = lambda h: self.texts.remove(h)
1927+
txt._remove_method = self.texts.remove
19341928
self.stale = True
19351929
return txt
19361930

@@ -1993,7 +1987,7 @@ def add_patch(self, p):
19931987
p.set_clip_path(self.patch)
19941988
self._update_patch_limits(p)
19951989
self.patches.append(p)
1996-
p._remove_method = lambda h: self.patches.remove(h)
1990+
p._remove_method = self.patches.remove
19971991
return p
19981992

19991993
def _update_patch_limits(self, patch):
@@ -2039,7 +2033,7 @@ def add_table(self, tab):
20392033
self._set_artist_props(tab)
20402034
self.tables.append(tab)
20412035
tab.set_clip_path(self.patch)
2042-
tab._remove_method = lambda h: self.tables.remove(h)
2036+
tab._remove_method = self.tables.remove
20432037
return tab
20442038

20452039
def add_container(self, container):
@@ -2053,7 +2047,7 @@ def add_container(self, container):
20532047
if not label:
20542048
container.set_label('_container%d' % len(self.containers))
20552049
self.containers.append(container)
2056-
container.set_remove_method(lambda h: self.containers.remove(h))
2050+
container._remove_method = self.containers.remove
20572051
return container
20582052

20592053
def _on_units_changed(self, scalex=False, scaley=False):

lib/matplotlib/container.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
from __future__ import (absolute_import, division, print_function,
2-
unicode_literals)
3-
41
import six
52

63
import matplotlib.cbook as cbook
@@ -32,6 +29,7 @@ def __init__(self, kl, label=None):
3229

3330
self.set_label(label)
3431

32+
@cbook.deprecated("3.0")
3533
def set_remove_method(self, f):
3634
self._remove_method = f
3735

@@ -44,13 +42,6 @@ def remove(self):
4442
if self._remove_method:
4543
self._remove_method(self)
4644

47-
def __getstate__(self):
48-
d = self.__dict__.copy()
49-
# remove the unpicklable remove method, this will get re-added on load
50-
# (by the axes) if the artist lives on an axes.
51-
d['_remove_method'] = None
52-
return d
53-
5445
def get_label(self):
5546
"""
5647
Get the label used for this artist in the legend.

lib/matplotlib/figure.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -890,7 +890,7 @@ def figimage(self, X, xo=0, yo=0, alpha=None, norm=None, cmap=None,
890890
if norm is None:
891891
im.set_clim(vmin, vmax)
892892
self.images.append(im)
893-
im._remove_method = lambda h: self.images.remove(h)
893+
im._remove_method = self.images.remove
894894
self.stale = True
895895
return im
896896

@@ -1162,7 +1162,7 @@ def add_axes(self, *args, **kwargs):
11621162

11631163
self._axstack.add(key, a)
11641164
self.sca(a)
1165-
a._remove_method = self.__remove_ax
1165+
a._remove_method = self._remove_ax
11661166
self.stale = True
11671167
a.stale_callback = _stale_figure_callback
11681168
return a
@@ -1269,7 +1269,7 @@ def add_subplot(self, *args, **kwargs):
12691269
a = subplot_class_factory(projection_class)(self, *args, **kwargs)
12701270
self._axstack.add(key, a)
12711271
self.sca(a)
1272-
a._remove_method = self.__remove_ax
1272+
a._remove_method = self._remove_ax
12731273
self.stale = True
12741274
a.stale_callback = _stale_figure_callback
12751275
return a
@@ -1402,7 +1402,7 @@ def subplots(self, nrows=1, ncols=1, sharex=False, sharey=False,
14021402
# Returned axis array will be always 2-d, even if nrows=ncols=1.
14031403
return axarr
14041404

1405-
def __remove_ax(self, ax):
1405+
def _remove_ax(self, ax):
14061406
def _reset_loc_form(axis):
14071407
axis.set_major_formatter(axis.get_major_formatter())
14081408
axis.set_major_locator(axis.get_major_locator())
@@ -1768,7 +1768,7 @@ def legend(self, *args, **kwargs):
17681768
pass
17691769
l = mlegend.Legend(self, handles, labels, *extra_args, **kwargs)
17701770
self.legends.append(l)
1771-
l._remove_method = lambda h: self.legends.remove(h)
1771+
l._remove_method = self.legends.remove
17721772
self.stale = True
17731773
return l
17741774

@@ -1796,7 +1796,7 @@ def text(self, x, y, s, *args, **kwargs):
17961796
t.update(override)
17971797
self._set_artist_props(t)
17981798
self.texts.append(t)
1799-
t._remove_method = lambda h: self.texts.remove(h)
1799+
t._remove_method = self.texts.remove
18001800
self.stale = True
18011801
return t
18021802

lib/mpl_toolkits/axes_grid1/parasite_axes.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ def get_aux_axes(self, tr, viewlim_mode="equal", axes_class=None):
243243
# note that ax2.transData == tr + ax1.transData
244244
# Anthing you draw in ax2 will match the ticks and grids of ax1.
245245
self.parasites.append(ax2)
246-
ax2._remove_method = lambda h: self.parasites.remove(h)
246+
ax2._remove_method = self.parasites.remove
247247
return ax2
248248

249249
def _get_legend_handles(self, legend_handler_map=None):
@@ -304,20 +304,20 @@ def twinx(self, axes_class=None):
304304

305305
ax2 = parasite_axes_class(self, sharex=self, frameon=False)
306306
self.parasites.append(ax2)
307+
ax2._remove_method = self._remove_twinx
307308

308309
self.axis["right"].set_visible(False)
309310

310311
ax2.axis["right"].set_visible(True)
311312
ax2.axis["left", "top", "bottom"].set_visible(False)
312313

313-
def _remove_method(h):
314-
self.parasites.remove(h)
315-
self.axis["right"].set_visible(True)
316-
self.axis["right"].toggle(ticklabels=False, label=False)
317-
ax2._remove_method = _remove_method
318-
319314
return ax2
320315

316+
def _remove_twinx(self, ax):
317+
self.parasites.remove(ax)
318+
self.axis["right"].set_visible(True)
319+
self.axis["right"].toggle(ticklabels=False, label=False)
320+
321321
def twiny(self, axes_class=None):
322322
"""
323323
create a twin of Axes for generating a plot with a shared
@@ -333,20 +333,20 @@ def twiny(self, axes_class=None):
333333

334334
ax2 = parasite_axes_class(self, sharey=self, frameon=False)
335335
self.parasites.append(ax2)
336+
ax2._remove_method = self._remove_twiny
336337

337338
self.axis["top"].set_visible(False)
338339

339340
ax2.axis["top"].set_visible(True)
340341
ax2.axis["left", "right", "bottom"].set_visible(False)
341342

342-
def _remove_method(h):
343-
self.parasites.remove(h)
344-
self.axis["top"].set_visible(True)
345-
self.axis["top"].toggle(ticklabels=False, label=False)
346-
ax2._remove_method = _remove_method
347-
348343
return ax2
349344

345+
def _remove_twiny(self, ax):
346+
self.parasites.remove(ax)
347+
self.axis["top"].set_visible(True)
348+
self.axis["top"].toggle(ticklabels=False, label=False)
349+
350350
def twin(self, aux_trans=None, axes_class=None):
351351
"""
352352
create a twin of Axes for generating a plot with a sharex
@@ -368,7 +368,7 @@ def twin(self, aux_trans=None, axes_class=None):
368368
ax2 = parasite_axes_auxtrans_class(
369369
self, aux_trans, viewlim_mode="transform")
370370
self.parasites.append(ax2)
371-
ax2._remove_method = lambda h: self.parasites.remove(h)
371+
ax2._remove_method = self.parasites.remove
372372

373373
self.axis["top", "right"].set_visible(False)
374374

0 commit comments

Comments
 (0)