11""" define extension dtypes """
22import re
3- from typing import Any , Dict , List , Optional , Tuple , Type , Union
3+ from typing import Any , Dict , List , Optional , Tuple , Type , Union , cast
44import warnings
55
66import numpy as np
1111
1212from pandas .core .dtypes .generic import ABCCategoricalIndex , ABCDateOffset , ABCIndexClass
1313
14+ from pandas ._typing import Ordered
15+
1416from .base import ExtensionDtype
1517from .inference import is_bool , is_list_like
1618
2022# CategoricalDtype constructor to detect when ordered=None is explicitly passed
2123ordered_sentinel = object () # type: object
2224
23- # TODO(GH26403): Replace with Optional[bool] or bool
24- OrderedType = Union [None , bool , object ]
25-
2625
2726def register_extension_dtype (cls : Type [ExtensionDtype ],) -> Type [ExtensionDtype ]:
2827 """
@@ -222,7 +221,11 @@ class CategoricalDtype(PandasExtensionDtype, ExtensionDtype):
222221 _metadata = ("categories" , "ordered" , "_ordered_from_sentinel" )
223222 _cache = {} # type: Dict[str_type, PandasExtensionDtype]
224223
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 )
226229 self ._finalize (categories , ordered , fastpath = False )
227230
228231 @classmethod
@@ -235,7 +238,7 @@ def _from_fastpath(
235238
236239 @classmethod
237240 def _from_categorical_dtype (
238- cls , dtype : "CategoricalDtype" , categories = None , ordered : OrderedType = None
241+ cls , dtype : "CategoricalDtype" , categories = None , ordered : Ordered = None
239242 ) -> "CategoricalDtype" :
240243 if categories is ordered is None :
241244 return dtype
@@ -336,9 +339,7 @@ def _from_values_or_dtype(
336339
337340 return dtype
338341
339- def _finalize (
340- self , categories , ordered : OrderedType , fastpath : bool = False
341- ) -> None :
342+ def _finalize (self , categories , ordered : Ordered , fastpath : bool = False ) -> None :
342343
343344 if ordered is not None and ordered is not ordered_sentinel :
344345 self .validate_ordered (ordered )
@@ -423,7 +424,7 @@ def __repr__(self):
423424 return tpl .format (data , self ._ordered )
424425
425426 @staticmethod
426- def _hash_categories (categories , ordered : OrderedType = True ) -> int :
427+ def _hash_categories (categories , ordered : Ordered = True ) -> int :
427428 from pandas .core .util .hashing import (
428429 hash_array ,
429430 _combine_hash_arrays ,
@@ -475,7 +476,7 @@ def construct_array_type(cls):
475476 return Categorical
476477
477478 @staticmethod
478- def validate_ordered (ordered : OrderedType ) -> None :
479+ def validate_ordered (ordered : Ordered ) -> None :
479480 """
480481 Validates that we have a valid ordered parameter. If
481482 it is not a boolean, a TypeError will be raised.
@@ -529,7 +530,9 @@ def validate_categories(categories, fastpath: bool = False):
529530
530531 return categories
531532
532- def update_dtype (self , dtype : "CategoricalDtype" ) -> "CategoricalDtype" :
533+ def update_dtype (
534+ self , dtype : Union [str_type , "CategoricalDtype" ]
535+ ) -> "CategoricalDtype" :
533536 """
534537 Returns a CategoricalDtype with categories and ordered taken from dtype
535538 if specified, otherwise falling back to self if unspecified
@@ -551,6 +554,9 @@ def update_dtype(self, dtype: "CategoricalDtype") -> "CategoricalDtype":
551554 "got {dtype!r}"
552555 ).format (dtype = dtype )
553556 raise ValueError (msg )
557+ else :
558+ # from here on, dtype is a CategoricalDtype
559+ dtype = cast (CategoricalDtype , dtype )
554560
555561 # dtype is CDT: keep current categories/ordered if None
556562 new_categories = dtype .categories
@@ -583,7 +589,7 @@ def categories(self):
583589 return self ._categories
584590
585591 @property
586- def ordered (self ) -> OrderedType :
592+ def ordered (self ) -> Ordered :
587593 """
588594 Whether the categories have an ordered relationship.
589595 """
0 commit comments