From 642957e660cdb89e72695cd694ed716fa110ccad Mon Sep 17 00:00:00 2001 From: Anupam Date: Tue, 17 May 2022 01:27:29 +0530 Subject: [PATCH 1/6] Stacklevel argument updated #46687 --- doc/source/whatsnew/v1.5.0.rst | 1 + pandas/io/parsers/readers.py | 12 +++--------- pandas/util/_decorators.py | 6 ++++-- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/doc/source/whatsnew/v1.5.0.rst b/doc/source/whatsnew/v1.5.0.rst index 9f1c4755bc54f..4a0ac3f0e07b3 100644 --- a/doc/source/whatsnew/v1.5.0.rst +++ b/doc/source/whatsnew/v1.5.0.rst @@ -553,6 +553,7 @@ Other Deprecations - Deprecated the ``closed`` argument in :meth:`interval_range` in favor of ``inclusive`` argument; In a future version passing ``closed`` will raise (:issue:`40245`) - Deprecated the methods :meth:`DataFrame.mad`, :meth:`Series.mad`, and the corresponding groupby methods (:issue:`11787`) - Deprecated positional arguments to :meth:`Index.join` except for ``other``, use keyword-only arguments instead of positional arguments (:issue:`46518`) +- Deprecated passing arguments as positional in :meth:`stacklevel` (:issue:`46687`) .. --------------------------------------------------------------------------- .. _whatsnew_150.performance: diff --git a/pandas/io/parsers/readers.py b/pandas/io/parsers/readers.py index f853251d599d2..5e44b028d659c 100644 --- a/pandas/io/parsers/readers.py +++ b/pandas/io/parsers/readers.py @@ -828,9 +828,7 @@ def read_csv( ... -@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_csv", @@ -1167,9 +1165,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", @@ -1266,9 +1262,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/util/_decorators.py b/pandas/util/_decorators.py index 6f8889e9017d0..c034b7092be20 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,7 @@ def future_version_msg(version: str | None) -> str: def deprecate_nonkeyword_arguments( version: str | None, allowed_args: list[str] | None = None, - stacklevel: int = 2, + stacklevel: int = None, name: str | None = None, ) -> Callable[[F], F]: """ @@ -280,7 +281,7 @@ def deprecate_nonkeyword_arguments( defaults to list of all arguments not having the default value. - stacklevel : int, default=2 + stacklevel : int The stack level for warnings.warn name : str, optional @@ -304,6 +305,7 @@ def decorate(func): f"{future_version_msg(version)} all arguments of " f"{name or func.__qualname__}{{arguments}} will be keyword-only." ) + stacklevel = find_stack_level() @wraps(func) def wrapper(*args, **kwargs): From 43cd3852450530ff6b576c8f2dd5597ec86d6df3 Mon Sep 17 00:00:00 2001 From: Anupam Date: Tue, 17 May 2022 15:10:17 +0530 Subject: [PATCH 2/6] argument removed --- pandas/util/_decorators.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/util/_decorators.py b/pandas/util/_decorators.py index c034b7092be20..5d953dfa2373b 100644 --- a/pandas/util/_decorators.py +++ b/pandas/util/_decorators.py @@ -261,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 = None, name: str | None = None, ) -> Callable[[F], F]: """ From 30d97f00fddbb6a81ed149eb2f7a0e406612997d Mon Sep 17 00:00:00 2001 From: Anupam Date: Mon, 23 May 2022 09:54:14 +0530 Subject: [PATCH 3/6] param added --- pandas/util/_decorators.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/util/_decorators.py b/pandas/util/_decorators.py index 5d953dfa2373b..c034b7092be20 100644 --- a/pandas/util/_decorators.py +++ b/pandas/util/_decorators.py @@ -261,6 +261,7 @@ def future_version_msg(version: str | None) -> str: def deprecate_nonkeyword_arguments( version: str | None, allowed_args: list[str] | None = None, + stacklevel: int = None, name: str | None = None, ) -> Callable[[F], F]: """ From f491c651bf67cb8491dd805b4c78ef6ba76ebd48 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Tue, 14 Jun 2022 17:29:41 +0100 Subject: [PATCH 4/6] fixup --- pandas/core/generic.py | 1 - pandas/io/json/_json.py | 4 +--- pandas/io/xml.py | 4 +--- pandas/util/_decorators.py | 7 +------ 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index f32b347de32c3..7d9208c12a9cc 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -10970,7 +10970,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/xml.py b/pandas/io/xml.py index 181b0fe115f4c..f92dbfc467d89 100644 --- a/pandas/io/xml.py +++ b/pandas/io/xml.py @@ -954,9 +954,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/util/_decorators.py b/pandas/util/_decorators.py index 66d24a06bdccd..978f2982e6d18 100644 --- a/pandas/util/_decorators.py +++ b/pandas/util/_decorators.py @@ -261,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 = None, name: str | None = None, ) -> Callable[[F], F]: """ @@ -281,9 +280,6 @@ def deprecate_nonkeyword_arguments( defaults to list of all arguments not having the default value. - stacklevel : int - 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 @@ -305,7 +301,6 @@ def decorate(func): f"{future_version_msg(version)} all arguments of " f"{name or func.__qualname__}{{arguments}} will be keyword-only." ) - stacklevel = find_stack_level() @wraps(func) def wrapper(*args, **kwargs): @@ -314,7 +309,7 @@ def wrapper(*args, **kwargs): warnings.warn( msg.format(arguments=arguments), FutureWarning, - stacklevel=stacklevel, + stacklevel=find_stack_level(), ) return func(*args, **kwargs) From 4468340eba412a7fc45e155604f03da7d51b57ce Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Mon, 27 Jun 2022 10:28:16 +0200 Subject: [PATCH 5/6] remove stackevel from read_sas decorator --- pandas/io/sas/sasreader.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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], From 84676397197c3d8f4ba82a9c97d2e72987ca9116 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Mon, 27 Jun 2022 11:07:36 +0200 Subject: [PATCH 6/6] add read_table_check_warnings and use it in read_table posargs deprecation test --- pandas/tests/io/parser/common/test_common_basic.py | 3 +-- pandas/tests/io/parser/conftest.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) 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"