1
1
""" define extension dtypes """
2
2
import re
3
- from typing import Any , Dict , List , Optional , Tuple , Type , Union
3
+ from typing import Any , Dict , List , Optional , Tuple , Type , Union , cast
4
4
import warnings
5
5
6
6
import numpy as np
11
11
12
12
from pandas .core .dtypes .generic import ABCCategoricalIndex , ABCDateOffset , ABCIndexClass
13
13
14
+ from pandas ._typing import Ordered
15
+
14
16
from .base import ExtensionDtype
15
17
from .inference import is_bool , is_list_like
16
18
20
22
# CategoricalDtype constructor to detect when ordered=None is explicitly passed
21
23
ordered_sentinel = object () # type: object
22
24
23
- # TODO(GH26403): Replace with Optional[bool] or bool
24
- OrderedType = Union [None , bool , object ]
25
-
26
25
27
26
def register_extension_dtype (cls : Type [ExtensionDtype ],) -> Type [ExtensionDtype ]:
28
27
"""
@@ -222,7 +221,11 @@ class CategoricalDtype(PandasExtensionDtype, ExtensionDtype):
222
221
_metadata = ("categories" , "ordered" , "_ordered_from_sentinel" )
223
222
_cache = {} # type: Dict[str_type, PandasExtensionDtype]
224
223
225
- def __init__ (self , categories = None , ordered : OrderedType = ordered_sentinel ):
224
+ def __init__ (
225
+ self , categories = None , ordered : Union [Ordered , object ] = ordered_sentinel
226
+ ):
227
+ # TODO(GH26403): Set type of ordered to Ordered
228
+ ordered = cast (Ordered , ordered )
226
229
self ._finalize (categories , ordered , fastpath = False )
227
230
228
231
@classmethod
@@ -235,7 +238,7 @@ def _from_fastpath(
235
238
236
239
@classmethod
237
240
def _from_categorical_dtype (
238
- cls , dtype : "CategoricalDtype" , categories = None , ordered : OrderedType = None
241
+ cls , dtype : "CategoricalDtype" , categories = None , ordered : Ordered = None
239
242
) -> "CategoricalDtype" :
240
243
if categories is ordered is None :
241
244
return dtype
@@ -336,9 +339,7 @@ def _from_values_or_dtype(
336
339
337
340
return dtype
338
341
339
- def _finalize (
340
- self , categories , ordered : OrderedType , fastpath : bool = False
341
- ) -> None :
342
+ def _finalize (self , categories , ordered : Ordered , fastpath : bool = False ) -> None :
342
343
343
344
if ordered is not None and ordered is not ordered_sentinel :
344
345
self .validate_ordered (ordered )
@@ -423,7 +424,7 @@ def __repr__(self):
423
424
return tpl .format (data , self ._ordered )
424
425
425
426
@staticmethod
426
- def _hash_categories (categories , ordered : OrderedType = True ) -> int :
427
+ def _hash_categories (categories , ordered : Ordered = True ) -> int :
427
428
from pandas .core .util .hashing import (
428
429
hash_array ,
429
430
_combine_hash_arrays ,
@@ -475,7 +476,7 @@ def construct_array_type(cls):
475
476
return Categorical
476
477
477
478
@staticmethod
478
- def validate_ordered (ordered : OrderedType ) -> None :
479
+ def validate_ordered (ordered : Ordered ) -> None :
479
480
"""
480
481
Validates that we have a valid ordered parameter. If
481
482
it is not a boolean, a TypeError will be raised.
@@ -529,7 +530,9 @@ def validate_categories(categories, fastpath: bool = False):
529
530
530
531
return categories
531
532
532
- def update_dtype (self , dtype : "CategoricalDtype" ) -> "CategoricalDtype" :
533
+ def update_dtype (
534
+ self , dtype : Union [str_type , "CategoricalDtype" ]
535
+ ) -> "CategoricalDtype" :
533
536
"""
534
537
Returns a CategoricalDtype with categories and ordered taken from dtype
535
538
if specified, otherwise falling back to self if unspecified
@@ -551,6 +554,9 @@ def update_dtype(self, dtype: "CategoricalDtype") -> "CategoricalDtype":
551
554
"got {dtype!r}"
552
555
).format (dtype = dtype )
553
556
raise ValueError (msg )
557
+ else :
558
+ # from here on, dtype is a CategoricalDtype
559
+ dtype = cast (CategoricalDtype , dtype )
554
560
555
561
# dtype is CDT: keep current categories/ordered if None
556
562
new_categories = dtype .categories
@@ -583,7 +589,7 @@ def categories(self):
583
589
return self ._categories
584
590
585
591
@property
586
- def ordered (self ) -> OrderedType :
592
+ def ordered (self ) -> Ordered :
587
593
"""
588
594
Whether the categories have an ordered relationship.
589
595
"""
0 commit comments