@@ -479,10 +479,12 @@ def _validate_fill_value(self, fill_value):
479479 f"Got '{ str (fill_value )} '."
480480 )
481481 try :
482- fill_value = self ._validate_scalar (fill_value )
482+ return self ._validate_scalar (fill_value )
483483 except TypeError as err :
484+ if "Cannot compare tz-naive and tz-aware" in str (err ):
485+ # tzawareness-compat
486+ raise
484487 raise ValueError (msg ) from err
485- return self ._unbox (fill_value , setitem = True )
486488
487489 def _validate_shift_value (self , fill_value ):
488490 # TODO(2.0): once this deprecation is enforced, use _validate_fill_value
@@ -511,7 +513,14 @@ def _validate_shift_value(self, fill_value):
511513
512514 return self ._unbox (fill_value , setitem = True )
513515
514- def _validate_scalar (self , value , allow_listlike : bool = False ):
516+ def _validate_scalar (
517+ self ,
518+ value ,
519+ * ,
520+ allow_listlike : bool = False ,
521+ setitem : bool = True ,
522+ unbox : bool = True ,
523+ ):
515524 """
516525 Validate that the input value can be cast to our scalar_type.
517526
@@ -521,6 +530,11 @@ def _validate_scalar(self, value, allow_listlike: bool = False):
521530 allow_listlike: bool, default False
522531 When raising an exception, whether the message should say
523532 listlike inputs are allowed.
533+ setitem : bool, default True
534+ Whether to check compatibility with setitem strictness.
535+ unbox : bool, default True
536+ Whether to unbox the result before returning. Note: unbox=False
537+ skips the setitem compatibility check.
524538
525539 Returns
526540 -------
@@ -546,7 +560,12 @@ def _validate_scalar(self, value, allow_listlike: bool = False):
546560 msg = self ._validation_error_message (value , allow_listlike )
547561 raise TypeError (msg )
548562
549- return value
563+ if not unbox :
564+ # NB: In general NDArrayBackedExtensionArray will unbox here;
565+ # this option exists to prevent a performance hit in
566+ # TimedeltaIndex.get_loc
567+ return value
568+ return self ._unbox_scalar (value , setitem = setitem )
550569
551570 def _validation_error_message (self , value , allow_listlike : bool = False ) -> str :
552571 """
@@ -611,7 +630,7 @@ def _validate_listlike(self, value, allow_object: bool = False):
611630
612631 def _validate_searchsorted_value (self , value ):
613632 if not is_list_like (value ):
614- value = self ._validate_scalar (value , True )
633+ return self ._validate_scalar (value , allow_listlike = True , setitem = False )
615634 else :
616635 value = self ._validate_listlike (value )
617636
@@ -621,12 +640,7 @@ def _validate_setitem_value(self, value):
621640 if is_list_like (value ):
622641 value = self ._validate_listlike (value )
623642 else :
624- value = self ._validate_scalar (value , True )
625-
626- return self ._unbox (value , setitem = True )
627-
628- def _validate_insert_value (self , value ):
629- value = self ._validate_scalar (value )
643+ return self ._validate_scalar (value , allow_listlike = True )
630644
631645 return self ._unbox (value , setitem = True )
632646
0 commit comments