@@ -599,7 +599,7 @@ def _slice(self, obj, axis: int, kind=None):
599599
600600 def _get_setitem_indexer (self , key ):
601601 if self .axis is not None :
602- return self ._convert_tuple (key )
602+ return self ._convert_tuple (key , setting = True )
603603
604604 ax = self .obj ._get_axis (0 )
605605
@@ -612,15 +612,15 @@ def _get_setitem_indexer(self, key):
612612
613613 if isinstance (key , tuple ):
614614 try :
615- return self ._convert_tuple (key )
615+ return self ._convert_tuple (key , setting = True )
616616 except IndexingError :
617617 pass
618618
619619 if isinstance (key , range ):
620620 return list (key )
621621
622622 try :
623- return self ._convert_to_indexer (key , axis = 0 )
623+ return self ._convert_to_indexer (key , axis = 0 , setting = True )
624624 except TypeError as e :
625625
626626 # invalid indexer type vs 'other' indexing errors
@@ -683,20 +683,22 @@ def _is_nested_tuple_indexer(self, tup: Tuple) -> bool:
683683 return any (is_nested_tuple (tup , ax ) for ax in self .obj .axes )
684684 return False
685685
686- def _convert_tuple (self , key ):
686+ def _convert_tuple (self , key , setting : bool = False ):
687687 keyidx = []
688688 if self .axis is not None :
689689 axis = self .obj ._get_axis_number (self .axis )
690690 for i in range (self .ndim ):
691691 if i == axis :
692- keyidx .append (self ._convert_to_indexer (key , axis = axis ))
692+ keyidx .append (
693+ self ._convert_to_indexer (key , axis = axis , setting = setting )
694+ )
693695 else :
694696 keyidx .append (slice (None ))
695697 else :
696698 for i , k in enumerate (key ):
697699 if i >= self .ndim :
698700 raise IndexingError ("Too many indexers" )
699- idx = self ._convert_to_indexer (k , axis = i )
701+ idx = self ._convert_to_indexer (k , axis = i , setting = setting )
700702 keyidx .append (idx )
701703 return tuple (keyidx )
702704
@@ -1566,7 +1568,7 @@ def _validate_read_indexer(
15661568 "https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike" # noqa:E501
15671569 )
15681570
1569- def _convert_to_indexer (self , key , axis : int ):
1571+ def _convert_to_indexer (self , key , axis : int , setting : bool = False ):
15701572 raise AbstractMethodError (self )
15711573
15721574 def __getitem__ (self , key ):
@@ -1775,7 +1777,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int):
17751777 # return a DatetimeIndex instead of a slice object.
17761778 return self .obj .take (indexer , axis = axis )
17771779
1778- def _convert_to_indexer (self , key , axis : int ):
1780+ def _convert_to_indexer (self , key , axis : int , setting : bool = False ):
17791781 """
17801782 Convert indexing key into something we can use to do actual fancy
17811783 indexing on a ndarray.
@@ -1795,12 +1797,14 @@ def _convert_to_indexer(self, key, axis: int):
17951797 if isinstance (key , slice ):
17961798 return self ._convert_slice_indexer (key , axis )
17971799
1798- # try to find out correct indexer, if not type correct raise
1799- try :
1800- key = self ._convert_scalar_indexer (key , axis )
1801- except TypeError :
1802- # but we will allow setting
1803- pass
1800+ if is_scalar (key ):
1801+ # try to find out correct indexer, if not type correct raise
1802+ try :
1803+ key = self ._convert_scalar_indexer (key , axis )
1804+ except TypeError :
1805+ # but we will allow setting
1806+ if not setting :
1807+ raise
18041808
18051809 # see if we are positional in nature
18061810 is_int_index = labels .is_integer ()
@@ -2032,7 +2036,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int):
20322036 indexer = self ._convert_slice_indexer (slice_obj , axis )
20332037 return self ._slice (indexer , axis = axis , kind = "iloc" )
20342038
2035- def _convert_to_indexer (self , key , axis : int ):
2039+ def _convert_to_indexer (self , key , axis : int , setting : bool = False ):
20362040 """
20372041 Much simpler as we only have to deal with our valid types.
20382042 """
0 commit comments