1
1
import functools
2
- import textwrap
2
+ import inspect
3
3
import warnings
4
4
5
5
@@ -118,6 +118,11 @@ def deprecated(since, message='', name='', alternative='', pending=False,
118
118
"""
119
119
Decorator to mark a function or a class as deprecated.
120
120
121
+ When deprecating a classmethod, a staticmethod, or a property, the
122
+ ``@deprecated`` decorator should go *under* the ``@classmethod``, etc.
123
+ decorator (i.e., `deprecated` should directly decorate the underlying
124
+ callable).
125
+
121
126
Parameters
122
127
----------
123
128
since : str
@@ -184,31 +189,22 @@ def deprecate(obj, message=message, name=name, alternative=alternative,
184
189
185
190
if isinstance (obj , type ):
186
191
obj_type = "class"
187
- old_doc = obj .__doc__
188
192
func = obj .__init__
193
+ old_doc = obj .__doc__
189
194
190
195
def finalize (wrapper , new_doc ):
191
196
obj .__doc__ = new_doc
192
197
obj .__init__ = wrapper
193
198
return obj
194
199
else :
195
200
obj_type = "function"
196
- if isinstance (obj , classmethod ):
197
- func = obj .__func__
198
- old_doc = func .__doc__
199
-
200
- def finalize (wrapper , new_doc ):
201
- wrapper = functools .wraps (func )(wrapper )
202
- wrapper .__doc__ = new_doc
203
- return classmethod (wrapper )
204
- else :
205
- func = obj
206
- old_doc = func .__doc__
207
-
208
- def finalize (wrapper , new_doc ):
209
- wrapper = functools .wraps (func )(wrapper )
210
- wrapper .__doc__ = new_doc
211
- return wrapper
201
+ func = obj
202
+ old_doc = func .__doc__
203
+
204
+ def finalize (wrapper , new_doc ):
205
+ wrapper = functools .wraps (func )(wrapper )
206
+ wrapper .__doc__ = new_doc
207
+ return wrapper
212
208
213
209
message = _generate_deprecation_message (
214
210
since , message , name , alternative , pending , obj_type , addendum ,
@@ -221,11 +217,13 @@ def wrapper(*args, **kwargs):
221
217
_warn_external (message , category )
222
218
return func (* args , ** kwargs )
223
219
224
- old_doc = textwrap . dedent (old_doc or '' ).strip ('\n ' )
220
+ old_doc = inspect . cleandoc (old_doc or '' ).strip ('\n ' )
225
221
message = message .strip ()
226
- new_doc = (('\n .. deprecated:: %(since)s'
227
- '\n %(message)s\n \n ' %
228
- {'since' : since , 'message' : message }) + old_doc )
222
+ new_doc = ('.. deprecated:: {since}\n '
223
+ ' {message}\n '
224
+ '\n '
225
+ '{old_doc}'
226
+ .format (since = since , message = message , old_doc = old_doc ))
229
227
if not old_doc :
230
228
# This is to prevent a spurious 'unexected unindent' warning from
231
229
# docutils when the original docstring was blank.
0 commit comments