Skip to content

Commit f1b89f4

Browse files
committed
use instancecheck. Modify SparseArray for 3.6 to use metaclass pattern
1 parent 461b0fc commit f1b89f4

File tree

2 files changed

+51
-41
lines changed

2 files changed

+51
-41
lines changed

pandas/__init__.py

+33-30
Original file line numberDiff line numberDiff line change
@@ -304,41 +304,53 @@ class __Datetime(type):
304304
datetime = dt
305305

306306
def __getattr__(cls, item):
307-
import warnings
308-
309-
warnings.warn(
310-
"The pandas.datetime class is deprecated "
311-
"and will be removed from pandas in a future version. "
312-
"Import from datetime instead.",
313-
FutureWarning,
314-
stacklevel=2,
315-
)
307+
cls.emitWarning()
316308

317309
try:
318310
return getattr(cls.datetime, item)
319311
except AttributeError:
320312
raise AttributeError(f"module datetime has no attribute {item}")
321313

314+
def __instancecheck__(cls, other):
315+
if isinstance(other, cls.datetime):
316+
return True
317+
else:
318+
return False
319+
322320
class __DatetimeSub(metaclass=__Datetime):
323-
def __new__(cls, *args, **kwargs):
321+
def emitWarning():
324322
import warnings
325323

326324
warnings.warn(
327325
"The pandas.datetime class is deprecated "
328326
"and will be removed from pandas in a future version. "
329327
"Import from datetime instead.",
330328
FutureWarning,
331-
stacklevel=2,
329+
stacklevel=3,
332330
)
333331

332+
def __new__(cls, *args, **kwargs):
333+
cls.emitWarning()
334334
from datetime import datetime as dt
335335

336336
return dt(*args, **kwargs)
337337

338338
datetime = __DatetimeSub
339339

340-
class __SparseArray(pandas.core.arrays.sparse.SparseArray):
341-
def __warnSparseArray(self):
340+
class __SparseArray(type):
341+
342+
from pandas.core.arrays.sparse import SparseArray as sa
343+
344+
SparseArray = sa
345+
346+
def __instancecheck__(cls, other):
347+
if isinstance(other, cls.SparseArray):
348+
return True
349+
else:
350+
return False
351+
352+
class __SparseArraySub(metaclass=__SparseArray):
353+
def emitWarning():
342354
import warnings
343355

344356
warnings.warn(
@@ -349,23 +361,14 @@ def __warnSparseArray(self):
349361
stacklevel=3,
350362
)
351363

352-
def __init__(
353-
self,
354-
data,
355-
sparse_index=None,
356-
index=None,
357-
fill_value=None,
358-
kind="integer",
359-
dtype=None,
360-
copy=False,
361-
):
362-
self.__warnSparseArray()
363-
super().__init__(data, sparse_index, index, fill_value, kind, dtype, copy)
364-
365-
def __getattr__(self, name):
366-
return super().__getattribute__(name)
367-
368-
SparseArray = __SparseArray
364+
def __new__(cls, *args, **kwargs):
365+
cls.emitWarning()
366+
from pandas.core.arrays.sparse import SparseArray as sa
367+
368+
return sa(*args, **kwargs)
369+
370+
SparseArray = __SparseArraySub
371+
369372

370373
# module level doc-string
371374
__doc__ = """

pandas/tests/api/test_api.py

+18-11
Original file line numberDiff line numberDiff line change
@@ -235,17 +235,14 @@ def test_depr(self):
235235
)
236236
for depr in deprecated_list:
237237
with tm.assert_produces_warning(FutureWarning):
238-
if compat.PY37:
239-
getattr(pd, depr)
240-
elif depr == "datetime":
241-
deprecated = getattr(pd, "__Datetime")
242-
deprecated.__getattr__(deprecated, dir(pd.datetime.datetime)[-1])
243-
elif depr == "SparseArray":
244-
deprecated = getattr(pd, depr)
245-
deprecated([])
246-
else:
247-
deprecated = getattr(pd, depr)
248-
deprecated.__getattr__(dir(deprecated)[-1])
238+
deprecated = getattr(pd, depr)
239+
if not compat.PY37:
240+
if depr == "datetime":
241+
deprecated.__getattr__(dir(pd.datetime.datetime)[-1])
242+
elif depr == "SparseArray":
243+
deprecated([])
244+
else:
245+
deprecated.__getattr__(dir(deprecated)[-1])
249246

250247

251248
def test_datetime():
@@ -256,6 +253,16 @@ def test_datetime():
256253
warnings.simplefilter("ignore", FutureWarning)
257254
assert datetime(2015, 1, 2, 0, 0) == pd.datetime(2015, 1, 2, 0, 0)
258255

256+
assert isinstance(pd.datetime(2015, 1, 2, 0, 0), pd.datetime)
257+
258+
259+
def test_sparsearray():
260+
import warnings
261+
262+
with warnings.catch_warnings():
263+
warnings.simplefilter("ignore", FutureWarning)
264+
assert isinstance(pd.array([1, 2, 3], dtype="Sparse"), pd.SparseArray)
265+
259266

260267
def test_np():
261268
import numpy as np

0 commit comments

Comments
 (0)