diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 589ea6e67d926..5d2331298fc98 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -10973,7 +10973,6 @@ def _add_numeric_operations(cls): @deprecate_nonkeyword_arguments( version=None, allowed_args=["self"], - stacklevel=find_stack_level() - 1, name="DataFrame.any and Series.any", ) @doc( diff --git a/pandas/io/json/_json.py b/pandas/io/json/_json.py index fbea7a71202eb..b6261b05f6cd7 100644 --- a/pandas/io/json/_json.py +++ b/pandas/io/json/_json.py @@ -318,9 +318,7 @@ def obj_to_write(self) -> NDFrame | Mapping[IndexLabel, Any]: decompression_options=_shared_docs["decompression_options"] % "path_or_buf", ) @deprecate_kwarg(old_arg_name="numpy", new_arg_name=None) -@deprecate_nonkeyword_arguments( - version="2.0", allowed_args=["path_or_buf"], stacklevel=3 -) +@deprecate_nonkeyword_arguments(version="2.0", allowed_args=["path_or_buf"]) def read_json( path_or_buf=None, orient=None, diff --git a/pandas/io/parsers/readers.py b/pandas/io/parsers/readers.py index e811ace78f1f5..763bae946a1b4 100644 --- a/pandas/io/parsers/readers.py +++ b/pandas/io/parsers/readers.py @@ -1166,9 +1166,7 @@ def read_table( ... -@deprecate_nonkeyword_arguments( - version=None, allowed_args=["filepath_or_buffer"], stacklevel=3 -) +@deprecate_nonkeyword_arguments(version=None, allowed_args=["filepath_or_buffer"]) @Appender( _doc_read_csv_and_table.format( func_name="read_table", @@ -1265,9 +1263,7 @@ def read_table( return _read(filepath_or_buffer, kwds) -@deprecate_nonkeyword_arguments( - version=None, allowed_args=["filepath_or_buffer"], stacklevel=2 -) +@deprecate_nonkeyword_arguments(version=None, allowed_args=["filepath_or_buffer"]) def read_fwf( filepath_or_buffer: FilePath | ReadCsvBuffer[bytes] | ReadCsvBuffer[str], colspecs: Sequence[tuple[int, int]] | str | None = "infer", diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 052e674d1a488..57014ef9c9622 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -78,9 +78,7 @@ def read_sas( ... -@deprecate_nonkeyword_arguments( - version=None, allowed_args=["filepath_or_buffer"], stacklevel=2 -) +@deprecate_nonkeyword_arguments(version=None, allowed_args=["filepath_or_buffer"]) @doc(decompression_options=_shared_docs["decompression_options"]) def read_sas( filepath_or_buffer: FilePath | ReadBuffer[bytes], diff --git a/pandas/io/xml.py b/pandas/io/xml.py index 78fbeaad09300..57bb72a951853 100644 --- a/pandas/io/xml.py +++ b/pandas/io/xml.py @@ -974,9 +974,7 @@ def _parse( ) -@deprecate_nonkeyword_arguments( - version=None, allowed_args=["path_or_buffer"], stacklevel=2 -) +@deprecate_nonkeyword_arguments(version=None, allowed_args=["path_or_buffer"]) @doc( storage_options=_shared_docs["storage_options"], decompression_options=_shared_docs["decompression_options"] % "path_or_buffer", diff --git a/pandas/tests/io/parser/common/test_common_basic.py b/pandas/tests/io/parser/common/test_common_basic.py index 7f60fd60c91b0..a0da3a7eaadce 100644 --- a/pandas/tests/io/parser/common/test_common_basic.py +++ b/pandas/tests/io/parser/common/test_common_basic.py @@ -920,5 +920,4 @@ def test_read_table_posargs_deprecation(all_parsers): "In a future version of pandas all arguments of read_table " "except for the argument 'filepath_or_buffer' will be keyword-only" ) - with tm.assert_produces_warning(FutureWarning, match=msg): - parser.read_table(data, " ") + parser.read_table_check_warnings(FutureWarning, msg, data, " ") diff --git a/pandas/tests/io/parser/conftest.py b/pandas/tests/io/parser/conftest.py index 066f448d97505..0462d1fe6da0b 100644 --- a/pandas/tests/io/parser/conftest.py +++ b/pandas/tests/io/parser/conftest.py @@ -42,6 +42,16 @@ def read_table(self, *args, **kwargs): kwargs = self.update_kwargs(kwargs) return read_table(*args, **kwargs) + def read_table_check_warnings( + self, warn_type: type[Warning], warn_msg: str, *args, **kwargs + ): + # We need to check the stacklevel here instead of in the tests + # since this is where read_table is called and where the warning + # should point to. + kwargs = self.update_kwargs(kwargs) + with tm.assert_produces_warning(warn_type, match=warn_msg): + return read_table(*args, **kwargs) + class CParser(BaseParser): engine = "c" diff --git a/pandas/util/_decorators.py b/pandas/util/_decorators.py index 0f15511e491cc..978f2982e6d18 100644 --- a/pandas/util/_decorators.py +++ b/pandas/util/_decorators.py @@ -13,6 +13,7 @@ from pandas._libs.properties import cache_readonly # noqa:F401 from pandas._typing import F +from pandas.util._exceptions import find_stack_level def deprecate( @@ -260,7 +261,6 @@ def future_version_msg(version: str | None) -> str: def deprecate_nonkeyword_arguments( version: str | None, allowed_args: list[str] | None = None, - stacklevel: int = 2, name: str | None = None, ) -> Callable[[F], F]: """ @@ -280,9 +280,6 @@ def deprecate_nonkeyword_arguments( defaults to list of all arguments not having the default value. - stacklevel : int, default=2 - The stack level for warnings.warn - name : str, optional The specific name of the function to show in the warning message. If None, then the Qualified name of the function @@ -312,7 +309,7 @@ def wrapper(*args, **kwargs): warnings.warn( msg.format(arguments=arguments), FutureWarning, - stacklevel=stacklevel, + stacklevel=find_stack_level(), ) return func(*args, **kwargs)