1
1
""" define extension dtypes """
2
2
import re
3
- from typing import Any , Dict , Optional , Tuple , Type
3
+ from typing import Any , Dict , List , Optional , Tuple , Type , Union
4
4
import warnings
5
5
6
6
import numpy as np
18
18
str_type = str
19
19
20
20
21
- def register_extension_dtype (cls ):
21
+ def register_extension_dtype (cls : Type [ExtensionDtype ],
22
+ ) -> Type [ExtensionDtype ]:
22
23
"""
23
24
Register an ExtensionType with pandas as class decorator.
24
25
@@ -60,9 +61,9 @@ class Registry:
60
61
These are tried in order.
61
62
"""
62
63
def __init__ (self ):
63
- self .dtypes = []
64
+ self .dtypes = [] # type: List[Type[ExtensionDtype]]
64
65
65
- def register (self , dtype ) :
66
+ def register (self , dtype : Type [ ExtensionDtype ]) -> None :
66
67
"""
67
68
Parameters
68
69
----------
@@ -73,11 +74,13 @@ def register(self, dtype):
73
74
74
75
self .dtypes .append (dtype )
75
76
76
- def find (self , dtype ):
77
+ def find (self ,
78
+ dtype : Union [Type [ExtensionDtype ], str ],
79
+ ) -> Optional [Type [ExtensionDtype ]]:
77
80
"""
78
81
Parameters
79
82
----------
80
- dtype : PandasExtensionDtype or string
83
+ dtype : Type[ExtensionDtype] or string
81
84
82
85
Returns
83
86
-------
@@ -126,28 +129,28 @@ class PandasExtensionDtype(ExtensionDtype):
126
129
isnative = 0
127
130
_cache = {} # type: Dict[str_type, 'PandasExtensionDtype']
128
131
129
- def __str__ (self ):
132
+ def __str__ (self ) -> str_type :
130
133
"""
131
134
Return a string representation for a particular Object
132
135
"""
133
136
return self .name
134
137
135
- def __repr__ (self ):
138
+ def __repr__ (self ) -> str_type :
136
139
"""
137
140
Return a string representation for a particular object.
138
141
"""
139
142
return str (self )
140
143
141
- def __hash__ (self ):
144
+ def __hash__ (self ) -> int :
142
145
raise NotImplementedError ("sub-classes should implement an __hash__ "
143
146
"method" )
144
147
145
- def __getstate__ (self ):
148
+ def __getstate__ (self ) -> Dict [ str_type , Any ] :
146
149
# pickle support; we don't want to pickle the cache
147
150
return {k : getattr (self , k , None ) for k in self ._metadata }
148
151
149
152
@classmethod
150
- def reset_cache (cls ):
153
+ def reset_cache (cls ) -> None :
151
154
""" clear the cache """
152
155
cls ._cache = {}
153
156
@@ -211,17 +214,24 @@ class CategoricalDtype(PandasExtensionDtype, ExtensionDtype):
211
214
_metadata = ('categories' , 'ordered' )
212
215
_cache = {} # type: Dict[str_type, PandasExtensionDtype]
213
216
214
- def __init__ (self , categories = None , ordered = None ):
217
+ def __init__ (self , categories = None , ordered : bool = None ):
215
218
self ._finalize (categories , ordered , fastpath = False )
216
219
217
220
@classmethod
218
- def _from_fastpath (cls , categories = None , ordered = None ):
221
+ def _from_fastpath (cls ,
222
+ categories = None ,
223
+ ordered : bool = None
224
+ ) -> 'CategoricalDtype' :
219
225
self = cls .__new__ (cls )
220
226
self ._finalize (categories , ordered , fastpath = True )
221
227
return self
222
228
223
229
@classmethod
224
- def _from_categorical_dtype (cls , dtype , categories = None , ordered = None ):
230
+ def _from_categorical_dtype (cls ,
231
+ dtype : 'CategoricalDtype' ,
232
+ categories = None ,
233
+ ordered : bool = None ,
234
+ ) -> 'CategoricalDtype' :
225
235
if categories is ordered is None :
226
236
return dtype
227
237
if categories is None :
@@ -231,8 +241,12 @@ def _from_categorical_dtype(cls, dtype, categories=None, ordered=None):
231
241
return cls (categories , ordered )
232
242
233
243
@classmethod
234
- def _from_values_or_dtype (cls , values = None , categories = None , ordered = None ,
235
- dtype = None ):
244
+ def _from_values_or_dtype (cls ,
245
+ values = None ,
246
+ categories = None ,
247
+ ordered : bool = None ,
248
+ dtype : 'CategoricalDtype' = None ,
249
+ ) -> 'CategoricalDtype' :
236
250
"""
237
251
Construct dtype from the input parameters used in :class:`Categorical`.
238
252
@@ -314,7 +328,11 @@ def _from_values_or_dtype(cls, values=None, categories=None, ordered=None,
314
328
315
329
return dtype
316
330
317
- def _finalize (self , categories , ordered , fastpath = False ):
331
+ def _finalize (self ,
332
+ categories ,
333
+ ordered : Optional [bool ],
334
+ fastpath : bool = False ,
335
+ ) -> None :
318
336
319
337
if ordered is not None :
320
338
self .validate_ordered (ordered )
@@ -326,14 +344,14 @@ def _finalize(self, categories, ordered, fastpath=False):
326
344
self ._categories = categories
327
345
self ._ordered = ordered
328
346
329
- def __setstate__ (self , state ) :
347
+ def __setstate__ (self , state : Dict [ str_type , Any ]) -> None :
330
348
# for pickle compat. __get_state__ is defined in the
331
349
# PandasExtensionDtype superclass and uses the public properties to
332
350
# pickle -> need to set the settable private ones here (see GH26067)
333
351
self ._categories = state .pop ('categories' , None )
334
352
self ._ordered = state .pop ('ordered' , False )
335
353
336
- def __hash__ (self ):
354
+ def __hash__ (self ) -> int :
337
355
# _hash_categories returns a uint64, so use the negative
338
356
# space for when we have unknown categories to avoid a conflict
339
357
if self .categories is None :
@@ -344,7 +362,7 @@ def __hash__(self):
344
362
# We *do* want to include the real self.ordered here
345
363
return int (self ._hash_categories (self .categories , self .ordered ))
346
364
347
- def __eq__ (self , other ) :
365
+ def __eq__ (self , other : Any ) -> bool :
348
366
"""
349
367
Rules for CDT equality:
350
368
1) Any CDT is equal to the string 'category'
@@ -391,7 +409,7 @@ def __repr__(self):
391
409
return tpl .format (data , self .ordered )
392
410
393
411
@staticmethod
394
- def _hash_categories (categories , ordered = True ):
412
+ def _hash_categories (categories , ordered : Optional [ bool ] = True ) -> int :
395
413
from pandas .core .util .hashing import (
396
414
hash_array , _combine_hash_arrays , hash_tuples
397
415
)
@@ -441,7 +459,7 @@ def construct_array_type(cls):
441
459
return Categorical
442
460
443
461
@staticmethod
444
- def validate_ordered (ordered ) :
462
+ def validate_ordered (ordered : bool ) -> None :
445
463
"""
446
464
Validates that we have a valid ordered parameter. If
447
465
it is not a boolean, a TypeError will be raised.
@@ -461,7 +479,7 @@ def validate_ordered(ordered):
461
479
raise TypeError ("'ordered' must either be 'True' or 'False'" )
462
480
463
481
@staticmethod
464
- def validate_categories (categories , fastpath = False ):
482
+ def validate_categories (categories , fastpath : bool = False ):
465
483
"""
466
484
Validates that we have good categories
467
485
@@ -475,7 +493,7 @@ def validate_categories(categories, fastpath=False):
475
493
-------
476
494
categories : Index
477
495
"""
478
- from pandas import Index
496
+ from pandas . core . indexes . base import Index
479
497
480
498
if not fastpath and not is_list_like (categories ):
481
499
msg = "Parameter 'categories' must be list-like, was {!r}"
@@ -496,7 +514,7 @@ def validate_categories(categories, fastpath=False):
496
514
497
515
return categories
498
516
499
- def update_dtype (self , dtype ) :
517
+ def update_dtype (self , dtype : 'CategoricalDtype' ) -> 'CategoricalDtype' :
500
518
"""
501
519
Returns a CategoricalDtype with categories and ordered taken from dtype
502
520
if specified, otherwise falling back to self if unspecified
@@ -538,14 +556,14 @@ def categories(self):
538
556
return self ._categories
539
557
540
558
@property
541
- def ordered (self ):
559
+ def ordered (self ) -> Optional [ bool ] :
542
560
"""
543
561
Whether the categories have an ordered relationship.
544
562
"""
545
563
return self ._ordered
546
564
547
565
@property
548
- def _is_boolean (self ):
566
+ def _is_boolean (self ) -> bool :
549
567
from pandas .core .dtypes .common import is_bool_dtype
550
568
551
569
return is_bool_dtype (self .categories )
0 commit comments