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

Skip to content

Commit 479c84e

Browse files
committed
Machinery for deprecating properties.
- Generate a message saying 'The foo attribute has been deprecated' instead of 'The foo function'. - Automatically deprecate the setter at the same time as the getter. - Also emit the warning when accessing the attribute on the class rather than on an instance. (Compare with the recently removed attempt at supporting deprecation of classmethods, which didn't really bring anything except the ability to put the `@deprecated` decorator over the `@classmethod` decorator.)
1 parent 70a55db commit 479c84e

12 files changed

+52
-31
lines changed

lib/matplotlib/__init__.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -781,30 +781,30 @@ class RcParams(MutableMapping, dict):
781781
for key, (default, converter) in defaultParams.items()
782782
if key not in _all_deprecated}
783783

784-
@property
785784
@cbook.deprecated("3.0")
785+
@property
786786
def msg_depr(self):
787787
return "%s is deprecated and replaced with %s; please use the latter."
788788

789-
@property
790789
@cbook.deprecated("3.0")
790+
@property
791791
def msg_depr_ignore(self):
792792
return "%s is deprecated and ignored. Use %s instead."
793793

794-
@property
795794
@cbook.deprecated("3.0")
795+
@property
796796
def msg_depr_set(self):
797797
return ("%s is deprecated. Please remove it from your matplotlibrc "
798798
"and/or style files.")
799799

800-
@property
801800
@cbook.deprecated("3.0")
801+
@property
802802
def msg_obsolete(self):
803803
return ("%s is obsolete. Please remove it from your matplotlibrc "
804804
"and/or style files.")
805805

806-
@property
807806
@cbook.deprecated("3.0")
807+
@property
808808
def msg_backend_obsolete(self):
809809
return ("The {} rcParam was deprecated in version 2.2. In order to "
810810
"force the use of a specific Qt binding, either import that "

lib/matplotlib/artist.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ class Artist(object):
5656
5757
Typically, all visible elements in a figure are subclasses of Artist.
5858
"""
59-
@property
6059
@cbook.deprecated("3.1")
60+
@property
6161
def aname(self):
6262
return 'Artist'
6363

lib/matplotlib/axes/_axes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ class Axes(_AxesBase):
128128
"""
129129
### Labelling, legend and texts
130130

131-
@property
132131
@cbook.deprecated("3.1")
132+
@property
133133
def aname(self):
134134
return 'Axes'
135135

lib/matplotlib/axes/_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1094,8 +1094,8 @@ def cla(self):
10941094

10951095
self.stale = True
10961096

1097-
@property
10981097
@cbook.deprecated("3.0")
1098+
@property
10991099
def mouseover_set(self):
11001100
return frozenset(self._mouseover_set)
11011101

lib/matplotlib/axis.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -774,13 +774,12 @@ def _set_scale(self, value, **kwargs):
774774
def limit_range_for_scale(self, vmin, vmax):
775775
return self._scale.limit_range_for_scale(vmin, vmax, self.get_minpos())
776776

777-
@property
778777
@cbook.deprecated("2.2.0")
778+
@property
779779
def unit_data(self):
780780
return self.units
781781

782782
@unit_data.setter
783-
@cbook.deprecated("2.2.0")
784783
def unit_data(self, unit_data):
785784
self.set_units(unit_data)
786785

lib/matplotlib/backends/backend_pdf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,8 +653,8 @@ def fontName(self, fontprop):
653653

654654
return Fx
655655

656-
@property
657656
@cbook.deprecated("3.0")
657+
@property
658658
def texFontMap(self):
659659
# lazy-load texFontMap, it takes a while to parse
660660
# and usetex is a relatively rare use case

lib/matplotlib/backends/backend_ps.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ class PsBackendHelper(object):
4646
def __init__(self):
4747
self._cached = {}
4848

49-
@property
5049
@cbook.deprecated("3.1")
50+
@property
5151
def gs_exe(self):
5252
"""
5353
executable name of ghostscript.
@@ -64,8 +64,8 @@ def gs_exe(self):
6464
self._cached["gs_exe"] = str(gs_exe)
6565
return str(gs_exe)
6666

67-
@property
6867
@cbook.deprecated("3.1")
68+
@property
6969
def gs_version(self):
7070
"""
7171
version of ghostscript.
@@ -87,8 +87,8 @@ def gs_version(self):
8787
self._cached["gs_version"] = gs_version
8888
return gs_version
8989

90-
@property
9190
@cbook.deprecated("3.1")
91+
@property
9292
def supports_ps2write(self):
9393
"""
9494
True if the installed ghostscript supports ps2write device.

lib/matplotlib/backends/backend_qt5.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -377,18 +377,15 @@ def keyReleaseEvent(self, event):
377377
if key is not None:
378378
FigureCanvasBase.key_release_event(self, key, guiEvent=event)
379379

380+
@cbook.deprecated("3.0", alternative="event.guiEvent.isAutoRepeat")
380381
@property
381-
@cbook.deprecated("3.0", "Manually check `event.guiEvent.isAutoRepeat()` "
382-
"in the event handler.")
383382
def keyAutoRepeat(self):
384383
"""
385384
If True, enable auto-repeat for key events.
386385
"""
387386
return self._keyautorepeat
388387

389388
@keyAutoRepeat.setter
390-
@cbook.deprecated("3.0", "Manually check `event.guiEvent.isAutoRepeat()` "
391-
"in the event handler.")
392389
def keyAutoRepeat(self, val):
393390
self._keyautorepeat = bool(val)
394391

lib/matplotlib/cbook/deprecation.py

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def warn_deprecated(
116116
def deprecated(since, message='', name='', alternative='', pending=False,
117117
obj_type=None, addendum='', *, removal=''):
118118
"""
119-
Decorator to mark a function or a class as deprecated.
119+
Decorator to mark a function, a class, or a property as deprecated.
120120
121121
When deprecating a classmethod, a staticmethod, or a property, the
122122
``@deprecated`` decorator should go *under* the ``@classmethod``, etc.
@@ -145,7 +145,7 @@ def deprecated(since, message='', name='', alternative='', pending=False,
145145
146146
def new_function():
147147
...
148-
oldFunction = new_function
148+
old_function = new_function
149149
150150
alternative : str, optional
151151
An alternative API that the user may use in place of the deprecated
@@ -183,22 +183,47 @@ def the_function_to_deprecate():
183183

184184
def deprecate(obj, message=message, name=name, alternative=alternative,
185185
pending=pending, addendum=addendum):
186-
187-
if not name:
188-
name = obj.__name__
189-
190186
if isinstance(obj, type):
191187
obj_type = "class"
192188
func = obj.__init__
189+
name = name or obj.__name__
193190
old_doc = obj.__doc__
194191

195192
def finalize(wrapper, new_doc):
196193
obj.__doc__ = new_doc
197194
obj.__init__ = wrapper
198195
return obj
196+
197+
elif isinstance(obj, property):
198+
obj_type = "attribute"
199+
func = None
200+
name = name or obj.fget.__name__
201+
old_doc = obj.__doc__
202+
203+
class _deprecated_property(property):
204+
def __get__(self, instance, owner):
205+
from . import _warn_external
206+
_warn_external(message, category)
207+
return super().__get__(instance, owner)
208+
209+
def __set__(self, instance, value):
210+
from . import _warn_external
211+
_warn_external(message, category)
212+
return super().__set__(instance, value)
213+
214+
def __delete__(self, instance):
215+
from . import _warn_external
216+
_warn_external(message, category)
217+
return super().__delete__(instance)
218+
219+
def finalize(_, new_doc):
220+
return _deprecated_property(
221+
fget=obj.fget, fset=obj.fset, fdel=obj.fdel, doc=new_doc)
222+
199223
else:
200224
obj_type = "function"
201225
func = obj
226+
name = name or obj.__name__
202227
old_doc = func.__doc__
203228

204229
def finalize(wrapper, new_doc):

lib/matplotlib/contour.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,11 +216,11 @@ def clabel(self, *args,
216216
self.labelTextsList = cbook.silent_list('text.Text', self.labelTexts)
217217
return self.labelTextsList
218218

219-
cl = property(cbook.deprecated("3.0", alternative="labelTexts")(
219+
cl = cbook.deprecated("3.0", alternative="labelTexts")(property(
220220
lambda self: self.labelTexts))
221-
cl_xy = property(cbook.deprecated("3.0", alternative="labelXYs")(
221+
cl_xy = cbook.deprecated("3.0", alternative="labelXYs")(property(
222222
lambda self: self.labelXYs))
223-
cl_cvalues = property(cbook.deprecated("3.0", alternative="labelCValues")(
223+
cl_cvalues = cbook.deprecated("3.0", alternative="labelCValues")(property(
224224
lambda self: self.labelCValues))
225225

226226
def print_label(self, linecontour, labelwidth):

lib/matplotlib/font_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -984,13 +984,13 @@ def __init__(self, size=None, weight='normal'):
984984
self.afmlist = createFontList(afmfiles, fontext='afm')
985985
self.defaultFont['afm'] = afmfiles[0] if afmfiles else None
986986

987-
@property
988987
@cbook.deprecated("3.0")
988+
@property
989989
def ttffiles(self):
990990
return [font.fname for font in self.ttflist]
991991

992-
@property
993992
@cbook.deprecated("3.0")
993+
@property
994994
def afmfiles(self):
995995
return [font.fname for font in self.afmlist]
996996

lib/matplotlib/texmanager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ class TexManager(object):
6262
# Caches.
6363
rgba_arrayd = {}
6464
grey_arrayd = {}
65-
postscriptd = property(mpl.cbook.deprecated("2.2")(lambda self: {}))
66-
pscnt = property(mpl.cbook.deprecated("2.2")(lambda self: 0))
65+
postscriptd = mpl.cbook.deprecated("2.2")(property(lambda self: {}))
66+
pscnt = mpl.cbook.deprecated("2.2")(property(lambda self: 0))
6767

6868
serif = ('cmr', '')
6969
sans_serif = ('cmss', '')

0 commit comments

Comments
 (0)