From 7e40812cdce86840dc506d45c5c86adf9a654d21 Mon Sep 17 00:00:00 2001 From: Anatoly Myachev Date: Thu, 16 May 2024 22:28:10 +0200 Subject: [PATCH] FIX-#7263: Empty docstrings should not be inherited (#7264) Signed-off-by: Anatoly Myachev --- .../pandas_on_dask/partitioning/virtual_partition.py | 4 ++-- .../partitioning/virtual_partition.py | 4 ++-- .../pandas_on_ray/partitioning/virtual_partition.py | 4 ++-- .../partitioning/virtual_partition.py | 4 ++-- modin/core/storage_formats/base/query_compiler.py | 12 +++++++----- modin/pandas/accessor.py | 2 +- modin/pandas/base.py | 2 +- modin/pandas/dataframe.py | 2 +- modin/pandas/groupby.py | 12 ++++++------ modin/pandas/series_utils.py | 12 ++++++------ modin/utils.py | 4 ++++ scripts/doc_checker.py | 4 +++- 12 files changed, 37 insertions(+), 29 deletions(-) diff --git a/modin/core/execution/dask/implementations/pandas_on_dask/partitioning/virtual_partition.py b/modin/core/execution/dask/implementations/pandas_on_dask/partitioning/virtual_partition.py index 3fc37855d6f..ea1b5543ddf 100644 --- a/modin/core/execution/dask/implementations/pandas_on_dask/partitioning/virtual_partition.py +++ b/modin/core/execution/dask/implementations/pandas_on_dask/partitioning/virtual_partition.py @@ -237,12 +237,12 @@ def wait(self): DaskWrapper.wait(self.list_of_blocks) -@_inherit_docstrings(PandasOnDaskDataframeVirtualPartition.__init__) +@_inherit_docstrings(PandasOnDaskDataframeVirtualPartition) class PandasOnDaskDataframeColumnPartition(PandasOnDaskDataframeVirtualPartition): axis = 0 -@_inherit_docstrings(PandasOnDaskDataframeVirtualPartition.__init__) +@_inherit_docstrings(PandasOnDaskDataframeVirtualPartition) class PandasOnDaskDataframeRowPartition(PandasOnDaskDataframeVirtualPartition): axis = 1 diff --git a/modin/core/execution/python/implementations/pandas_on_python/partitioning/virtual_partition.py b/modin/core/execution/python/implementations/pandas_on_python/partitioning/virtual_partition.py index 611ff3c8b18..69dc10493e4 100644 --- a/modin/core/execution/python/implementations/pandas_on_python/partitioning/virtual_partition.py +++ b/modin/core/execution/python/implementations/pandas_on_python/partitioning/virtual_partition.py @@ -48,11 +48,11 @@ class PandasOnPythonDataframeAxisPartition(PandasDataframeAxisPartition): partition_type = PandasOnPythonDataframePartition -@_inherit_docstrings(PandasOnPythonDataframeAxisPartition.__init__) +@_inherit_docstrings(PandasOnPythonDataframeAxisPartition) class PandasOnPythonDataframeColumnPartition(PandasOnPythonDataframeAxisPartition): axis = 0 -@_inherit_docstrings(PandasOnPythonDataframeAxisPartition.__init__) +@_inherit_docstrings(PandasOnPythonDataframeAxisPartition) class PandasOnPythonDataframeRowPartition(PandasOnPythonDataframeAxisPartition): axis = 1 diff --git a/modin/core/execution/ray/implementations/pandas_on_ray/partitioning/virtual_partition.py b/modin/core/execution/ray/implementations/pandas_on_ray/partitioning/virtual_partition.py index 67d21f6cbe0..51cedb23609 100644 --- a/modin/core/execution/ray/implementations/pandas_on_ray/partitioning/virtual_partition.py +++ b/modin/core/execution/ray/implementations/pandas_on_ray/partitioning/virtual_partition.py @@ -266,12 +266,12 @@ def wait(self): RayWrapper.wait(futures) -@_inherit_docstrings(PandasOnRayDataframeVirtualPartition.__init__) +@_inherit_docstrings(PandasOnRayDataframeVirtualPartition) class PandasOnRayDataframeColumnPartition(PandasOnRayDataframeVirtualPartition): axis = 0 -@_inherit_docstrings(PandasOnRayDataframeVirtualPartition.__init__) +@_inherit_docstrings(PandasOnRayDataframeVirtualPartition) class PandasOnRayDataframeRowPartition(PandasOnRayDataframeVirtualPartition): axis = 1 diff --git a/modin/core/execution/unidist/implementations/pandas_on_unidist/partitioning/virtual_partition.py b/modin/core/execution/unidist/implementations/pandas_on_unidist/partitioning/virtual_partition.py index dbbbca0d5c9..ab093c7c2e6 100644 --- a/modin/core/execution/unidist/implementations/pandas_on_unidist/partitioning/virtual_partition.py +++ b/modin/core/execution/unidist/implementations/pandas_on_unidist/partitioning/virtual_partition.py @@ -259,12 +259,12 @@ def wait(self): UnidistWrapper.wait(futures) -@_inherit_docstrings(PandasOnUnidistDataframeVirtualPartition.__init__) +@_inherit_docstrings(PandasOnUnidistDataframeVirtualPartition) class PandasOnUnidistDataframeColumnPartition(PandasOnUnidistDataframeVirtualPartition): axis = 0 -@_inherit_docstrings(PandasOnUnidistDataframeVirtualPartition.__init__) +@_inherit_docstrings(PandasOnUnidistDataframeVirtualPartition) class PandasOnUnidistDataframeRowPartition(PandasOnUnidistDataframeVirtualPartition): axis = 1 diff --git a/modin/core/storage_formats/base/query_compiler.py b/modin/core/storage_formats/base/query_compiler.py index f3051b07574..8e50e69bc2b 100644 --- a/modin/core/storage_formats/base/query_compiler.py +++ b/modin/core/storage_formats/base/query_compiler.py @@ -1117,7 +1117,7 @@ def merge_asof( tolerance=None, allow_exact_matches: bool = True, direction: str = "backward", - ): + ): # noqa: GL08 # Pandas fallbacks for tricky cases: if ( # No idea how this works or why it does what it does; and in fact @@ -3621,7 +3621,9 @@ def groupby_fillna( drop=drop, ) - def groupby_diff(self, by, axis, groupby_kwargs, agg_args, agg_kwargs, drop=False): + def groupby_diff( + self, by, axis, groupby_kwargs, agg_args, agg_kwargs, drop=False + ): # noqa: GL08 return self.groupby_agg( by=by, agg_func="diff", @@ -3634,7 +3636,7 @@ def groupby_diff(self, by, axis, groupby_kwargs, agg_args, agg_kwargs, drop=Fals def groupby_pct_change( self, by, axis, groupby_kwargs, agg_args, agg_kwargs, drop=False - ): + ): # noqa: GL08 return self.groupby_agg( by=by, agg_func="pct_change", @@ -3942,7 +3944,7 @@ def groupby_ohlc( agg_args, agg_kwargs, is_df, - ): + ): # noqa: GL08 if not is_df: return self.groupby_agg( by=by, @@ -4606,7 +4608,7 @@ def shift( freq, axis, fill_value, - ): + ): # noqa: GL08 return DataFrameDefault.register(pandas.DataFrame.shift)( self, periods, freq, axis, fill_value ) diff --git a/modin/pandas/accessor.py b/modin/pandas/accessor.py index 8a34423f5de..a46e89943f0 100644 --- a/modin/pandas/accessor.py +++ b/modin/pandas/accessor.py @@ -196,7 +196,7 @@ def __init__(self, name: str, accessor) -> None: self._name = name self._accessor = accessor - def __get__(self, obj, cls): + def __get__(self, obj, cls): # noqa: GL08 if obj is None: return self._accessor accessor_obj = self._accessor(obj) diff --git a/modin/pandas/base.py b/modin/pandas/base.py index 746ed2ec9fa..4a23b575601 100644 --- a/modin/pandas/base.py +++ b/modin/pandas/base.py @@ -1127,7 +1127,7 @@ def between_time( ) ) - def _deprecate_downcast(self, downcast, method_name: str): + def _deprecate_downcast(self, downcast, method_name: str): # noqa: GL08 if downcast is not lib.no_default: warnings.warn( f"The 'downcast' keyword in {method_name} is deprecated and " diff --git a/modin/pandas/dataframe.py b/modin/pandas/dataframe.py index 7cbfc2634d9..fe28d3680e0 100644 --- a/modin/pandas/dataframe.py +++ b/modin/pandas/dataframe.py @@ -1678,7 +1678,7 @@ def quantile( _AXIS_ORDERS = ["index", "columns"] _get_index_resolvers = pandas.DataFrame._get_index_resolvers - def _get_axis_resolvers(self, axis: str) -> dict: + def _get_axis_resolvers(self, axis: str) -> dict: # noqa: GL08 # forked from pandas because we only want to update the index if there's more # than one level of the index. # index or columns diff --git a/modin/pandas/groupby.py b/modin/pandas/groupby.py index ecbb5028d14..882ae19f6d7 100644 --- a/modin/pandas/groupby.py +++ b/modin/pandas/groupby.py @@ -86,7 +86,7 @@ @_inherit_docstrings(pandas.core.groupby.DataFrameGroupBy) -class DataFrameGroupBy(ClassLogger): +class DataFrameGroupBy(ClassLogger): # noqa: GL08 _pandas_class = pandas.core.groupby.DataFrameGroupBy _return_tuple_when_iterating = False _df: Union[DataFrame, Series] @@ -209,7 +209,7 @@ def default_handler(*args, **kwargs): return attr @property - def ngroups(self): + def ngroups(self): # noqa: GL08 return len(self) def skew(self, axis=lib.no_default, skipna=True, numeric_only=False, **kwargs): @@ -608,7 +608,7 @@ def filter(self, func, dropna=True, *args, **kwargs): lambda df: df.filter(func, dropna=dropna, *args, **kwargs) ) - def _deprecate_axis(self, axis: int, name: str) -> None: + def _deprecate_axis(self, axis: int, name: str) -> None: # noqa: GL08 if axis == 1: warnings.warn( f"{type(self).__name__}.{name} with axis=1 is deprecated and " @@ -1061,7 +1061,7 @@ def get_group(self, name, obj=None): ) ) - def __len__(self): + def __len__(self): # noqa: GL08 return len(self.indices) def all(self, skipna=True): @@ -1728,7 +1728,7 @@ def groupby_on_multiple_columns(df, *args, **kwargs): @_inherit_docstrings(pandas.core.groupby.SeriesGroupBy) -class SeriesGroupBy(DataFrameGroupBy): +class SeriesGroupBy(DataFrameGroupBy): # noqa: GL08 _pandas_class = pandas.core.groupby.SeriesGroupBy @property @@ -1810,7 +1810,7 @@ def value_counts( ascending: bool = False, bins=None, dropna: bool = True, - ): + ): # noqa: GL08 return self._default_to_pandas( lambda ser: ser.value_counts( normalize=normalize, diff --git a/modin/pandas/series_utils.py b/modin/pandas/series_utils.py index 1ae8528334b..7003f325746 100644 --- a/modin/pandas/series_utils.py +++ b/modin/pandas/series_utils.py @@ -550,7 +550,7 @@ def isnumeric(self): def isdecimal(self): return self._Series(query_compiler=self._query_compiler.str_isdecimal()) - def __getitem__(self, key): + def __getitem__(self, key): # noqa: GL08 return self._Series(query_compiler=self._query_compiler.str___getitem__(key)) def _default_to_pandas(self, op, *args, **kwargs): @@ -577,7 +577,7 @@ def _default_to_pandas(self, op, *args, **kwargs): @_inherit_docstrings(pandas.core.indexes.accessors.CombinedDatetimelikeProperties) -class DatetimeProperties(ClassLogger): +class DatetimeProperties(ClassLogger): # noqa: GL08 _series: Series _query_compiler: BaseQueryCompiler @@ -700,15 +700,15 @@ def tz(self) -> "tzinfo | None": return dtype.tz @property - def freq(self): + def freq(self): # noqa: GL08 return self._query_compiler.dt_freq().to_pandas().squeeze() @property - def unit(self): + def unit(self): # noqa: GL08 # use `iloc[0]` to return scalar return self._Series(query_compiler=self._query_compiler.dt_unit()).iloc[0] - def as_unit(self, *args, **kwargs): + def as_unit(self, *args, **kwargs): # noqa: GL08 return self._Series( query_compiler=self._query_compiler.dt_as_unit(*args, **kwargs) ) @@ -810,7 +810,7 @@ def isocalendar(self): return DataFrame(query_compiler=self._query_compiler.dt_isocalendar()) @property - def qyear(self): + def qyear(self): # noqa: GL08 return self._Series(query_compiler=self._query_compiler.dt_qyear()) @property diff --git a/modin/utils.py b/modin/utils.py index 2182349e488..fdc5260b215 100644 --- a/modin/utils.py +++ b/modin/utils.py @@ -310,6 +310,9 @@ def _replace_doc( target_doc = target_obj.__doc__ or "" overwrite = overwrite or not target_doc doc = source_doc if overwrite else target_doc + if doc == "": + # Empty docstrings do not need to be inherited + return if parent_cls and not attr_name: if isinstance(target_obj, property): @@ -434,6 +437,7 @@ def _documentable_obj(obj: object) -> bool: """Check if `obj` docstring could be patched.""" return bool( callable(obj) + and not inspect.isclass(obj) or (isinstance(obj, property) and obj.fget) or (isinstance(obj, functools.cached_property)) or (isinstance(obj, (staticmethod, classmethod)) and obj.__func__) diff --git a/scripts/doc_checker.py b/scripts/doc_checker.py index a56bd1aaec5..5f8ac41ed4b 100644 --- a/scripts/doc_checker.py +++ b/scripts/doc_checker.py @@ -111,7 +111,9 @@ def check_optional_args(doc: Validator) -> list: list List of tuples with Modin error code and its description. """ - if not doc.doc_parameters: + # `not doc.raw_doc and doc.clean_doc` - means that docstring was + # automatically generated by numpydoc with help of `pydoc.getdoc`. + if not doc.doc_parameters or (not doc.raw_doc and doc.clean_doc): return [] optional_args = get_optional_args(doc) if not optional_args: