diff --git a/sklearn/linear_model/_glm/glm.py b/sklearn/linear_model/_glm/glm.py index 8974b16919aaa..81c85f41bfeac 100644 --- a/sklearn/linear_model/_glm/glm.py +++ b/sklearn/linear_model/_glm/glm.py @@ -424,7 +424,11 @@ def _get_loss(self): ) @property def family(self): - """Ensure backward compatibility for the time of deprecation.""" + """Ensure backward compatibility for the time of deprecation. + + .. deprecated:: 1.1 + Will be removed in 1.3 + """ if isinstance(self, PoissonRegressor): return "poisson" elif isinstance(self, GammaRegressor): diff --git a/sklearn/tests/test_docstrings.py b/sklearn/tests/test_docstrings.py index 7a470422ba961..f48eb6766c887 100644 --- a/sklearn/tests/test_docstrings.py +++ b/sklearn/tests/test_docstrings.py @@ -71,7 +71,13 @@ def filter_errors(errors, method, Klass=None): # Ignore PR02: Unknown parameters for properties. We sometimes use # properties for ducktyping, i.e. SGDClassifier.predict_proba - if code == "PR02" and Klass is not None and method is not None: + # Ignore GL08: Parsing of the method signature failed, possibly because this is + # a property. Properties are sometimes used for deprecated attributes and the + # attribute is already documented in the class docstring. + # + # All error codes: + # https://numpydoc.readthedocs.io/en/latest/validation.html#built-in-validation-checks + if code in ("PR02", "GL08") and Klass is not None and method is not None: method_obj = getattr(Klass, method) if isinstance(method_obj, property): continue diff --git a/sklearn/utils/deprecation.py b/sklearn/utils/deprecation.py index 2ee07154dc49b..19d41aa1eaf85 100644 --- a/sklearn/utils/deprecation.py +++ b/sklearn/utils/deprecation.py @@ -70,7 +70,6 @@ def wrapped(*args, **kwargs): cls.__init__ = wrapped wrapped.__name__ = "__init__" - wrapped.__doc__ = self._update_doc(init.__doc__) wrapped.deprecated_original = init return cls @@ -87,7 +86,6 @@ def wrapped(*args, **kwargs): warnings.warn(msg, category=FutureWarning) return fun(*args, **kwargs) - wrapped.__doc__ = self._update_doc(wrapped.__doc__) # Add a reference to the wrapped function so that we can introspect # on function arguments in Python 2 (already works in Python 3) wrapped.__wrapped__ = fun @@ -103,18 +101,8 @@ def wrapped(*args, **kwargs): warnings.warn(msg, category=FutureWarning) return prop.fget(*args, **kwargs) - wrapped.__doc__ = self._update_doc(wrapped.__doc__) - return wrapped - def _update_doc(self, olddoc): - newdoc = "DEPRECATED" - if self.extra: - newdoc = "%s: %s" % (newdoc, self.extra) - if olddoc: - newdoc = "%s\n\n %s" % (newdoc, olddoc) - return newdoc - def _is_deprecated(func): """Helper to check if func is wrapped by our deprecated decorator""" diff --git a/sklearn/utils/tests/test_deprecation.py b/sklearn/utils/tests/test_deprecation.py index e39486cc0318a..b810cfb85d3f6 100644 --- a/sklearn/utils/tests/test_deprecation.py +++ b/sklearn/utils/tests/test_deprecation.py @@ -65,12 +65,3 @@ def test_is_deprecated(): def test_pickle(): pickle.loads(pickle.dumps(mock_function)) - - -def test_deprecated_property_docstring_exists(): - """Deprecated property contains the original docstring.""" - mock_class_property = getattr(MockClass2, "n_features_") - assert ( - "DEPRECATED: n_features_ is deprecated\n\n Number of input features." - == mock_class_property.__doc__ - )