From 4ace5eb3d0bfa9f457b1a4bbc32d48b89593e90b Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 7 Jan 2020 14:57:46 -0500 Subject: [PATCH 01/12] fix deprecation test for python 3.7 --- pandas/tests/api/test_api.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pandas/tests/api/test_api.py b/pandas/tests/api/test_api.py index 72e2413ce87d9..ff995770b9212 100644 --- a/pandas/tests/api/test_api.py +++ b/pandas/tests/api/test_api.py @@ -98,7 +98,7 @@ class TestPDApi(Base): deprecated_classes: List[str] = [] # these should be deprecated in the future - deprecated_classes_in_future: List[str] = [] + deprecated_classes_in_future: List[str] = ["SparseArray"] # external modules exposed in pandas namespace modules: List[str] = [] @@ -206,17 +206,12 @@ def test_api(self): self.lib + self.misc + self.modules - + self.deprecated_modules + self.classes - + self.deprecated_classes - + self.deprecated_classes_in_future + self.funcs + self.funcs_option + self.funcs_read + self.funcs_json + self.funcs_to - + self.deprecated_funcs_in_future - + self.deprecated_funcs + self.private_modules, self.ignored, ) From 76dbae4e9d5fb4a38d63f471126dece15ca1baf8 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 7 Jan 2020 15:43:55 -0500 Subject: [PATCH 02/12] sparsearray OK for 3.6 --- pandas/__init__.py | 30 ++++++++++++++++++++++++++++-- pandas/tests/api/test_api.py | 10 +++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/pandas/__init__.py b/pandas/__init__.py index 10d65e41d3030..93f191cd9a3e0 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -321,9 +321,35 @@ def __getattr__(self, item): datetime = __Datetime().datetime - class SparseArray: - pass + class __SparseArray(pandas.core.arrays.sparse.SparseArray): + def __warnSparseArray(self): + import warnings + warnings.warn( + "The pandas.SparseArray class is deprecated " + "and will be removed from pandas in a future version. " + "Use pandas.arrays.SparseArray instead.", + FutureWarning, + stacklevel=3, + ) + + def __init__( + self, + data, + sparse_index=None, + index=None, + fill_value=None, + kind="integer", + dtype=None, + copy=False, + ): + self.__warnSparseArray() + super().__init__(data, sparse_index, index, fill_value, kind, dtype, copy) + + def __getattr__(self, name): + return super().__getattribute__(name) + + SparseArray = __SparseArray # module level doc-string __doc__ = """ diff --git a/pandas/tests/api/test_api.py b/pandas/tests/api/test_api.py index ff995770b9212..2451ed0058874 100644 --- a/pandas/tests/api/test_api.py +++ b/pandas/tests/api/test_api.py @@ -91,7 +91,7 @@ class TestPDApi(Base): "NamedAgg", ] if not compat.PY37: - classes.extend(["Panel", "SparseSeries", "SparseDataFrame", "SparseArray"]) + classes.extend(["Panel", "SparseSeries", "SparseDataFrame"]) deprecated_modules.extend(["np", "datetime"]) # these are already deprecated; awaiting removal @@ -206,12 +206,17 @@ def test_api(self): self.lib + self.misc + self.modules + + self.deprecated_modules + self.classes + + self.deprecated_classes + + self.deprecated_classes_in_future + self.funcs + self.funcs_option + self.funcs_read + self.funcs_json + self.funcs_to + + self.deprecated_funcs_in_future + + self.deprecated_funcs + self.private_modules, self.ignored, ) @@ -231,6 +236,9 @@ def test_depr(self): elif depr == "datetime": deprecated = getattr(pd, "__Datetime") deprecated().__getattr__(dir(pd.datetime)[-1]) + elif depr == "SparseArray": + deprecated = getattr(pd, depr) + deprecated([]) else: deprecated = getattr(pd, depr) deprecated.__getattr__(dir(deprecated)[-1]) From 2bbc831927bc8d56929cc0e09f91e0e423ceb74b Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 7 Jan 2020 15:51:35 -0500 Subject: [PATCH 03/12] handle 3.6/3.7 diffs --- pandas/tests/api/test_api.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pandas/tests/api/test_api.py b/pandas/tests/api/test_api.py index 2451ed0058874..1e44a6945e42e 100644 --- a/pandas/tests/api/test_api.py +++ b/pandas/tests/api/test_api.py @@ -90,15 +90,17 @@ class TestPDApi(Base): "UInt64Dtype", "NamedAgg", ] - if not compat.PY37: - classes.extend(["Panel", "SparseSeries", "SparseDataFrame"]) - deprecated_modules.extend(["np", "datetime"]) # these are already deprecated; awaiting removal deprecated_classes: List[str] = [] # these should be deprecated in the future - deprecated_classes_in_future: List[str] = ["SparseArray"] + deprecated_classes_in_future: List[str] = [] + + if not compat.PY37: + classes.extend(["Panel", "SparseSeries", "SparseDataFrame"]) + deprecated_modules.extend(["np", "datetime"]) + deprecated_classes_in_future.extend(["SparseArray"]) # external modules exposed in pandas namespace modules: List[str] = [] From def8d288b856a5b03bfa299baeba9baa5503442c Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 7 Jan 2020 15:56:46 -0500 Subject: [PATCH 04/12] formatted for black --- pandas/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/__init__.py b/pandas/__init__.py index 93f191cd9a3e0..73b407fcdae03 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -322,9 +322,9 @@ def __getattr__(self, item): datetime = __Datetime().datetime class __SparseArray(pandas.core.arrays.sparse.SparseArray): - def __warnSparseArray(self): import warnings + warnings.warn( "The pandas.SparseArray class is deprecated " "and will be removed from pandas in a future version. " @@ -332,7 +332,7 @@ def __warnSparseArray(self): FutureWarning, stacklevel=3, ) - + def __init__( self, data, @@ -345,10 +345,10 @@ def __init__( ): self.__warnSparseArray() super().__init__(data, sparse_index, index, fill_value, kind, dtype, copy) - + def __getattr__(self, name): return super().__getattribute__(name) - + SparseArray = __SparseArray # module level doc-string From ea7b959c942e39448ddfb962de2c1b16e62d80c7 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 7 Jan 2020 16:43:19 -0500 Subject: [PATCH 05/12] split test_api for 3.6 vs 3.7 --- pandas/tests/api/test_api.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/pandas/tests/api/test_api.py b/pandas/tests/api/test_api.py index 1e44a6945e42e..90d9a4ad3a36e 100644 --- a/pandas/tests/api/test_api.py +++ b/pandas/tests/api/test_api.py @@ -43,7 +43,7 @@ class TestPDApi(Base): ] # these are already deprecated; awaiting removal - deprecated_modules: List[str] = [] + deprecated_modules: List[str] = ["np", "datetime"] # misc misc = ["IndexSlice", "NaT", "NA"] @@ -95,12 +95,12 @@ class TestPDApi(Base): deprecated_classes: List[str] = [] # these should be deprecated in the future - deprecated_classes_in_future: List[str] = [] + deprecated_classes_in_future: List[str] = ["SparseArray"] if not compat.PY37: classes.extend(["Panel", "SparseSeries", "SparseDataFrame"]) - deprecated_modules.extend(["np", "datetime"]) - deprecated_classes_in_future.extend(["SparseArray"]) + # deprecated_modules.extend(["np", "datetime"]) + # deprecated_classes_in_future.extend(["SparseArray"]) # external modules exposed in pandas namespace modules: List[str] = [] @@ -203,25 +203,27 @@ class TestPDApi(Base): def test_api(self): - self.check( - pd, + checkthese = ( self.lib + self.misc + self.modules - + self.deprecated_modules + self.classes - + self.deprecated_classes - + self.deprecated_classes_in_future + self.funcs + self.funcs_option + self.funcs_read + self.funcs_json + self.funcs_to - + self.deprecated_funcs_in_future - + self.deprecated_funcs - + self.private_modules, - self.ignored, + + self.private_modules ) + if not compat.PY37: + checkthese.extend( + self.deprecated_modules + + self.deprecated_classes + + self.deprecated_classes_in_future + + self.deprecated_funcs_in_future + + self.deprecated_funcs + ) + self.check(pd, checkthese, self.ignored) def test_depr(self): deprecated = ( From 2e0bab04cd8e6bba71abc348076dcc969ef61b1e Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Tue, 7 Jan 2020 18:08:58 -0500 Subject: [PATCH 06/12] datetime fixes --- pandas/__init__.py | 2 +- pandas/tests/api/test_api.py | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/pandas/__init__.py b/pandas/__init__.py index 73b407fcdae03..23841c75c3921 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -319,7 +319,7 @@ def __getattr__(self, item): except AttributeError: raise AttributeError(f"module datetime has no attribute {item}") - datetime = __Datetime().datetime + datetime = __Datetime() class __SparseArray(pandas.core.arrays.sparse.SparseArray): def __warnSparseArray(self): diff --git a/pandas/tests/api/test_api.py b/pandas/tests/api/test_api.py index 90d9a4ad3a36e..f044befda20f2 100644 --- a/pandas/tests/api/test_api.py +++ b/pandas/tests/api/test_api.py @@ -226,20 +226,20 @@ def test_api(self): self.check(pd, checkthese, self.ignored) def test_depr(self): - deprecated = ( + deprecated_list = ( self.deprecated_modules + self.deprecated_classes + self.deprecated_classes_in_future + self.deprecated_funcs + self.deprecated_funcs_in_future ) - for depr in deprecated: + for depr in deprecated_list: with tm.assert_produces_warning(FutureWarning): if compat.PY37: getattr(pd, depr) elif depr == "datetime": deprecated = getattr(pd, "__Datetime") - deprecated().__getattr__(dir(pd.datetime)[-1]) + deprecated().__getattr__(dir(pd.datetime.datetime)[-1]) elif depr == "SparseArray": deprecated = getattr(pd, depr) deprecated([]) @@ -252,9 +252,10 @@ def test_datetime(): from datetime import datetime import warnings - with warnings.catch_warnings(): - warnings.simplefilter("ignore", FutureWarning) - assert datetime(2015, 1, 2, 0, 0) == pd.datetime(2015, 1, 2, 0, 0) + if compat.PY37: + with warnings.catch_warnings(): + warnings.simplefilter("ignore", FutureWarning) + assert datetime(2015, 1, 2, 0, 0) == pd.datetime(2015, 1, 2, 0, 0) def test_np(): From 5c59f841feec6ca2e5e78de5391e3b50c76b2fb6 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Wed, 8 Jan 2020 12:36:34 -0500 Subject: [PATCH 07/12] make datetime work with 3.6 --- pandas/__init__.py | 30 +++++++++++++++++++++++------- pandas/tests/api/test_api.py | 9 ++++----- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/pandas/__init__.py b/pandas/__init__.py index 23841c75c3921..4f1c79ea480c0 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -297,13 +297,13 @@ def __getattr__(self, item): np = __numpy() - class __Datetime: - def __init__(self): - from datetime import datetime as dt + class __Datetime(type): - self.datetime = dt + from datetime import datetime as dt - def __getattr__(self, item): + datetime = dt + + def __getattr__(cls, item): import warnings warnings.warn( @@ -315,11 +315,27 @@ def __getattr__(self, item): ) try: - return getattr(self.datetime, item) + return getattr(cls.datetime, item) except AttributeError: raise AttributeError(f"module datetime has no attribute {item}") - datetime = __Datetime() + class __DatetimeSub(metaclass=__Datetime): + def __new__(cls, *args, **kwargs): + import warnings + + warnings.warn( + "The pandas.datetime class is deprecated " + "and will be removed from pandas in a future version. " + "Import from datetime instead.", + FutureWarning, + stacklevel=2, + ) + + from datetime import datetime as dt + + return dt(*args, **kwargs) + + datetime = __DatetimeSub class __SparseArray(pandas.core.arrays.sparse.SparseArray): def __warnSparseArray(self): diff --git a/pandas/tests/api/test_api.py b/pandas/tests/api/test_api.py index f044befda20f2..cc8d2b6751e4f 100644 --- a/pandas/tests/api/test_api.py +++ b/pandas/tests/api/test_api.py @@ -239,7 +239,7 @@ def test_depr(self): getattr(pd, depr) elif depr == "datetime": deprecated = getattr(pd, "__Datetime") - deprecated().__getattr__(dir(pd.datetime.datetime)[-1]) + deprecated.__getattr__(deprecated, dir(pd.datetime.datetime)[-1]) elif depr == "SparseArray": deprecated = getattr(pd, depr) deprecated([]) @@ -252,10 +252,9 @@ def test_datetime(): from datetime import datetime import warnings - if compat.PY37: - with warnings.catch_warnings(): - warnings.simplefilter("ignore", FutureWarning) - assert datetime(2015, 1, 2, 0, 0) == pd.datetime(2015, 1, 2, 0, 0) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", FutureWarning) + assert datetime(2015, 1, 2, 0, 0) == pd.datetime(2015, 1, 2, 0, 0) def test_np(): From f1b89f4f3c74f8bcab1840389b475b2041391dbe Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Wed, 8 Jan 2020 16:06:24 -0500 Subject: [PATCH 08/12] use instancecheck. Modify SparseArray for 3.6 to use metaclass pattern --- pandas/__init__.py | 63 +++++++++++++++++++----------------- pandas/tests/api/test_api.py | 29 ++++++++++------- 2 files changed, 51 insertions(+), 41 deletions(-) diff --git a/pandas/__init__.py b/pandas/__init__.py index 4f1c79ea480c0..be8bd9069bbd2 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -304,23 +304,21 @@ class __Datetime(type): datetime = dt def __getattr__(cls, item): - import warnings - - warnings.warn( - "The pandas.datetime class is deprecated " - "and will be removed from pandas in a future version. " - "Import from datetime instead.", - FutureWarning, - stacklevel=2, - ) + cls.emitWarning() try: return getattr(cls.datetime, item) except AttributeError: raise AttributeError(f"module datetime has no attribute {item}") + def __instancecheck__(cls, other): + if isinstance(other, cls.datetime): + return True + else: + return False + class __DatetimeSub(metaclass=__Datetime): - def __new__(cls, *args, **kwargs): + def emitWarning(): import warnings warnings.warn( @@ -328,17 +326,31 @@ def __new__(cls, *args, **kwargs): "and will be removed from pandas in a future version. " "Import from datetime instead.", FutureWarning, - stacklevel=2, + stacklevel=3, ) + def __new__(cls, *args, **kwargs): + cls.emitWarning() from datetime import datetime as dt return dt(*args, **kwargs) datetime = __DatetimeSub - class __SparseArray(pandas.core.arrays.sparse.SparseArray): - def __warnSparseArray(self): + class __SparseArray(type): + + from pandas.core.arrays.sparse import SparseArray as sa + + SparseArray = sa + + def __instancecheck__(cls, other): + if isinstance(other, cls.SparseArray): + return True + else: + return False + + class __SparseArraySub(metaclass=__SparseArray): + def emitWarning(): import warnings warnings.warn( @@ -349,23 +361,14 @@ def __warnSparseArray(self): stacklevel=3, ) - def __init__( - self, - data, - sparse_index=None, - index=None, - fill_value=None, - kind="integer", - dtype=None, - copy=False, - ): - self.__warnSparseArray() - super().__init__(data, sparse_index, index, fill_value, kind, dtype, copy) - - def __getattr__(self, name): - return super().__getattribute__(name) - - SparseArray = __SparseArray + def __new__(cls, *args, **kwargs): + cls.emitWarning() + from pandas.core.arrays.sparse import SparseArray as sa + + return sa(*args, **kwargs) + + SparseArray = __SparseArraySub + # module level doc-string __doc__ = """ diff --git a/pandas/tests/api/test_api.py b/pandas/tests/api/test_api.py index cc8d2b6751e4f..d2c81409db18d 100644 --- a/pandas/tests/api/test_api.py +++ b/pandas/tests/api/test_api.py @@ -235,17 +235,14 @@ def test_depr(self): ) for depr in deprecated_list: with tm.assert_produces_warning(FutureWarning): - if compat.PY37: - getattr(pd, depr) - elif depr == "datetime": - deprecated = getattr(pd, "__Datetime") - deprecated.__getattr__(deprecated, dir(pd.datetime.datetime)[-1]) - elif depr == "SparseArray": - deprecated = getattr(pd, depr) - deprecated([]) - else: - deprecated = getattr(pd, depr) - deprecated.__getattr__(dir(deprecated)[-1]) + deprecated = getattr(pd, depr) + if not compat.PY37: + if depr == "datetime": + deprecated.__getattr__(dir(pd.datetime.datetime)[-1]) + elif depr == "SparseArray": + deprecated([]) + else: + deprecated.__getattr__(dir(deprecated)[-1]) def test_datetime(): @@ -256,6 +253,16 @@ def test_datetime(): warnings.simplefilter("ignore", FutureWarning) assert datetime(2015, 1, 2, 0, 0) == pd.datetime(2015, 1, 2, 0, 0) + assert isinstance(pd.datetime(2015, 1, 2, 0, 0), pd.datetime) + + +def test_sparsearray(): + import warnings + + with warnings.catch_warnings(): + warnings.simplefilter("ignore", FutureWarning) + assert isinstance(pd.array([1, 2, 3], dtype="Sparse"), pd.SparseArray) + def test_np(): import numpy as np From c31afa14ca6074280fd34e457481d643842f8e8b Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Wed, 8 Jan 2020 16:50:11 -0500 Subject: [PATCH 09/12] fix mypy issue for methods with no arguments --- pandas/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/__init__.py b/pandas/__init__.py index be8bd9069bbd2..42ede571d0fb2 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -318,7 +318,7 @@ def __instancecheck__(cls, other): return False class __DatetimeSub(metaclass=__Datetime): - def emitWarning(): + def emitWarning(dummy=0): import warnings warnings.warn( @@ -350,7 +350,7 @@ def __instancecheck__(cls, other): return False class __SparseArraySub(metaclass=__SparseArray): - def emitWarning(): + def emitWarning(dummy=0): import warnings warnings.warn( From 7861c9894e12c1b0826549b866f63309d305a565 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Wed, 8 Jan 2020 19:40:19 -0500 Subject: [PATCH 10/12] snake_case and better returns on isinstance --- pandas/__init__.py | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/pandas/__init__.py b/pandas/__init__.py index 42ede571d0fb2..491bcb21f245d 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -304,7 +304,7 @@ class __Datetime(type): datetime = dt def __getattr__(cls, item): - cls.emitWarning() + cls.emit_warning() try: return getattr(cls.datetime, item) @@ -312,13 +312,10 @@ def __getattr__(cls, item): raise AttributeError(f"module datetime has no attribute {item}") def __instancecheck__(cls, other): - if isinstance(other, cls.datetime): - return True - else: - return False + return isinstance(other, cls.datetime) class __DatetimeSub(metaclass=__Datetime): - def emitWarning(dummy=0): + def emit_warning(dummy=0): import warnings warnings.warn( @@ -330,7 +327,7 @@ def emitWarning(dummy=0): ) def __new__(cls, *args, **kwargs): - cls.emitWarning() + cls.emit_warning() from datetime import datetime as dt return dt(*args, **kwargs) @@ -344,13 +341,10 @@ class __SparseArray(type): SparseArray = sa def __instancecheck__(cls, other): - if isinstance(other, cls.SparseArray): - return True - else: - return False + return isinstance(other, cls.SparseArray) class __SparseArraySub(metaclass=__SparseArray): - def emitWarning(dummy=0): + def emit_warning(dummy=0): import warnings warnings.warn( @@ -362,7 +356,7 @@ def emitWarning(dummy=0): ) def __new__(cls, *args, **kwargs): - cls.emitWarning() + cls.emit_warning() from pandas.core.arrays.sparse import SparseArray as sa return sa(*args, **kwargs) From 7947a81c358d0e7d6ba5f34e5cec74da63bfb0f8 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Wed, 8 Jan 2020 21:45:02 -0500 Subject: [PATCH 11/12] shorten up imports for datetime and SparseArray --- pandas/__init__.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/pandas/__init__.py b/pandas/__init__.py index 491bcb21f245d..a38ff74705963 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -299,9 +299,7 @@ def __getattr__(self, item): class __Datetime(type): - from datetime import datetime as dt - - datetime = dt + from datetime import datetime def __getattr__(cls, item): cls.emit_warning() @@ -328,17 +326,15 @@ def emit_warning(dummy=0): def __new__(cls, *args, **kwargs): cls.emit_warning() - from datetime import datetime as dt + from datetime import datetime - return dt(*args, **kwargs) + return datetime(*args, **kwargs) datetime = __DatetimeSub class __SparseArray(type): - from pandas.core.arrays.sparse import SparseArray as sa - - SparseArray = sa + from pandas.core.arrays.sparse import SparseArray def __instancecheck__(cls, other): return isinstance(other, cls.SparseArray) @@ -357,9 +353,9 @@ def emit_warning(dummy=0): def __new__(cls, *args, **kwargs): cls.emit_warning() - from pandas.core.arrays.sparse import SparseArray as sa + from pandas.core.arrays.sparse import SparseArray - return sa(*args, **kwargs) + return SparseArray(*args, **kwargs) SparseArray = __SparseArraySub From d78eceade5dc6091a548b62d8daea5328a9d7749 Mon Sep 17 00:00:00 2001 From: Irv Lustig Date: Wed, 8 Jan 2020 22:14:59 -0500 Subject: [PATCH 12/12] revert import simplification to make mypy happy --- pandas/__init__.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/pandas/__init__.py b/pandas/__init__.py index a38ff74705963..491bcb21f245d 100644 --- a/pandas/__init__.py +++ b/pandas/__init__.py @@ -299,7 +299,9 @@ def __getattr__(self, item): class __Datetime(type): - from datetime import datetime + from datetime import datetime as dt + + datetime = dt def __getattr__(cls, item): cls.emit_warning() @@ -326,15 +328,17 @@ def emit_warning(dummy=0): def __new__(cls, *args, **kwargs): cls.emit_warning() - from datetime import datetime + from datetime import datetime as dt - return datetime(*args, **kwargs) + return dt(*args, **kwargs) datetime = __DatetimeSub class __SparseArray(type): - from pandas.core.arrays.sparse import SparseArray + from pandas.core.arrays.sparse import SparseArray as sa + + SparseArray = sa def __instancecheck__(cls, other): return isinstance(other, cls.SparseArray) @@ -353,9 +357,9 @@ def emit_warning(dummy=0): def __new__(cls, *args, **kwargs): cls.emit_warning() - from pandas.core.arrays.sparse import SparseArray + from pandas.core.arrays.sparse import SparseArray as sa - return SparseArray(*args, **kwargs) + return sa(*args, **kwargs) SparseArray = __SparseArraySub