@@ -40,7 +40,7 @@ class RangeIndex(Int64Index):
40
40
41
41
Parameters
42
42
----------
43
- start : int (default: 0), or other RangeIndex instance
43
+ start : int (default: 0), range or RangeIndex instance
44
44
If int and "stop" is not given, interpreted as "stop" instead.
45
45
stop : int (default: 0)
46
46
step : int (default: 1)
@@ -82,16 +82,14 @@ def __new__(cls, start=None, stop=None, step=None,
82
82
"removed in a future version." ,
83
83
FutureWarning , stacklevel = 2 )
84
84
if fastpath :
85
- return cls ._simple_new (start , stop , step , name = name )
85
+ return cls ._simple_new (range ( start , stop , step ) , name = name )
86
86
87
- cls ._validate_dtype (dtype )
88
-
89
- # RangeIndex
90
- if isinstance (start , RangeIndex ):
91
- if name is None :
92
- name = start .name
93
- return cls ._simple_new (name = name ,
94
- ** dict (start ._get_data_as_items ()))
87
+ # RangeIndex, range
88
+ if isinstance (start , (RangeIndex , range )):
89
+ if isinstance (start , RangeIndex ):
90
+ name = start .name if name is None else name
91
+ start = start ._range
92
+ return cls ._simple_new (start , dtype = dtype , name = name )
95
93
96
94
# validate the arguments
97
95
if com ._all_none (start , stop , step ):
@@ -108,10 +106,11 @@ def __new__(cls, start=None, stop=None, step=None,
108
106
if step == 0 :
109
107
raise ValueError ("Step must not be zero" )
110
108
111
- return cls ._simple_new (start , stop , step , name )
109
+ rng = range (start , stop , step )
110
+ return cls ._simple_new (rng , dtype = dtype , name = name )
112
111
113
112
@classmethod
114
- def from_range (cls , data , name = None , dtype = None , ** kwargs ):
113
+ def from_range (cls , data , name = None , dtype = None ):
115
114
"""
116
115
Create RangeIndex from a range object.
117
116
@@ -123,27 +122,22 @@ def from_range(cls, data, name=None, dtype=None, **kwargs):
123
122
raise TypeError (
124
123
'{0}(...) must be called with object coercible to a '
125
124
'range, {1} was passed' .format (cls .__name__ , repr (data )))
126
-
127
- start , stop , step = data .start , data .stop , data .step
128
- return cls (start , stop , step , dtype = dtype , name = name , ** kwargs )
125
+ return cls ._simple_new (data , dtype = dtype , name = name )
129
126
130
127
@classmethod
131
- def _simple_new (cls , start , stop = None , step = None , name = None ,
132
- dtype = None , ** kwargs ):
128
+ def _simple_new (cls , values , name = None , dtype = None , ** kwargs ):
133
129
result = object .__new__ (cls )
134
130
131
+ cls ._validate_dtype (dtype )
132
+
135
133
# handle passed None, non-integers
136
- if start is None and stop is None :
134
+ if values is None :
137
135
# empty
138
- start , stop , step = 0 , 0 , 1
139
-
140
- if start is None or not is_integer (start ):
141
- try :
142
- return cls (start , stop , step , name = name , ** kwargs )
143
- except TypeError :
144
- return Index (start , stop , step , name = name , ** kwargs )
136
+ values = range (0 , 0 , 1 )
137
+ elif not isinstance (values , range ):
138
+ return Index (values , dtype = dtype , name = name , ** kwargs )
145
139
146
- result ._range = range ( start , stop or 0 , step or 1 )
140
+ result ._range = values
147
141
148
142
result .name = name
149
143
for k , v in kwargs .items ():
@@ -360,8 +354,7 @@ def tolist(self):
360
354
def _shallow_copy (self , values = None , ** kwargs ):
361
355
if values is None :
362
356
name = kwargs .get ("name" , self .name )
363
- return self ._simple_new (
364
- name = name , ** dict (self ._get_data_as_items ()))
357
+ return self ._simple_new (self ._range , name = name )
365
358
else :
366
359
kwargs .setdefault ('name' , self .name )
367
360
return self ._int64index ._shallow_copy (values , ** kwargs )
@@ -480,11 +473,13 @@ def intersection(self, other, sort=False):
480
473
tmp_start = first .start + (second .start - first .start ) * \
481
474
first .step // gcd * s
482
475
new_step = first .step * second .step // gcd
483
- new_index = self ._simple_new (tmp_start , int_high , new_step )
476
+ new_range = range (tmp_start , int_high , new_step )
477
+ new_index = self ._simple_new (new_range )
484
478
485
479
# adjust index to limiting interval
486
480
new_start = new_index ._min_fitting_element (int_low )
487
- new_index = self ._simple_new (new_start , new_index .stop , new_index .step )
481
+ new_range = range (new_start , new_index .stop , new_index .step )
482
+ new_index = self ._simple_new (new_range )
488
483
489
484
if (self .step < 0 and other .step < 0 ) is not (new_index .step < 0 ):
490
485
new_index = new_index [::- 1 ]
@@ -640,10 +635,12 @@ def __floordiv__(self, other):
640
635
start = self .start // other
641
636
step = self .step // other
642
637
stop = start + len (self ) * step
643
- return self ._simple_new (start , stop , step , name = self .name )
638
+ new_range = range (start , stop , step or 1 )
639
+ return self ._simple_new (new_range , name = self .name )
644
640
if len (self ) == 1 :
645
641
start = self .start // other
646
- return self ._simple_new (start , start + 1 , 1 , name = self .name )
642
+ new_range = range (start , start + 1 , 1 )
643
+ return self ._simple_new (new_range , name = self .name )
647
644
return self ._int64index // other
648
645
649
646
def all (self ) -> bool :
0 commit comments