Skip to content

Commit 98d1881

Browse files
committed
collect ensure_int into ensure_python_int
1 parent 233aad0 commit 98d1881

File tree

2 files changed

+40
-30
lines changed

2 files changed

+40
-30
lines changed

pandas/core/dtypes/common.py

+29
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
""" common type operations """
22
import warnings
3+
from typing import Union
34

45
import numpy as np
56

@@ -125,6 +126,34 @@ def ensure_int_or_float(arr: ArrayLike, copy=False) -> np.array:
125126
return arr.astype('float64', copy=copy)
126127

127128

129+
def ensure_python_int(value: Union[int, np.integer]) -> int:
130+
"""
131+
Ensure that a value is a python int.
132+
133+
Parameters
134+
----------
135+
value: int or numpy.integer
136+
137+
Returns
138+
-------
139+
int
140+
141+
Raises
142+
------
143+
TypeError: if the value isn't an int or can't be converted to one.
144+
"""
145+
if not is_scalar(value):
146+
raise TypeError("Value needs to be a scalar value, was type {}"
147+
.format(type(value)))
148+
msg = "Wrong type {} for value {}"
149+
try:
150+
new_value = int(value)
151+
assert (new_value == value)
152+
except (TypeError, ValueError, AssertionError):
153+
raise TypeError(msg.format(type(value), value))
154+
return new_value
155+
156+
128157
def classes(*klasses):
129158
""" evaluate if the tipo is a subclass of the klasses """
130159
return lambda tipo: issubclass(tipo, klasses)

pandas/core/indexes/range.py

+11-30
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212

1313
from pandas.core.dtypes import concat as _concat
1414
from pandas.core.dtypes.common import (
15-
is_int64_dtype, is_integer, is_scalar, is_timedelta64_dtype)
15+
ensure_python_int, is_int64_dtype, is_integer, is_scalar,
16+
is_timedelta64_dtype)
1617
from pandas.core.dtypes.generic import (
1718
ABCDataFrame, ABCSeries, ABCTimedeltaIndex)
1819

@@ -92,39 +93,19 @@ def __new__(cls, start=None, stop=None, step=None,
9293
**dict(start._get_data_as_items()))
9394

9495
# validate the arguments
95-
def ensure_int(value, field):
96-
msg = ("RangeIndex(...) must be called with integers,"
97-
" {value} was passed for {field}")
98-
if not is_scalar(value):
99-
raise TypeError(msg.format(value=type(value).__name__,
100-
field=field))
101-
try:
102-
new_value = int(value)
103-
assert(new_value == value)
104-
except (TypeError, ValueError, AssertionError):
105-
raise TypeError(msg.format(value=type(value).__name__,
106-
field=field))
96+
if com._all_none(start, stop, step):
97+
raise TypeError("RangeIndex(...) must be called with integers")
10798

108-
return new_value
99+
start = ensure_python_int(start) if start is not None else 0
109100

110-
if com._all_none(start, stop, step):
111-
msg = "RangeIndex(...) must be called with integers"
112-
raise TypeError(msg)
113-
elif start is None:
114-
start = 0
115-
else:
116-
start = ensure_int(start, 'start')
117101
if stop is None:
118-
stop = start
119-
start = 0
102+
start, stop = 0, start
120103
else:
121-
stop = ensure_int(stop, 'stop')
122-
if step is None:
123-
step = 1
124-
elif step == 0:
104+
stop = ensure_python_int(stop)
105+
106+
step = ensure_python_int(step) if step is not None else 1
107+
if step == 0:
125108
raise ValueError("Step must not be zero")
126-
else:
127-
step = ensure_int(step, 'step')
128109

129110
return cls._simple_new(start, stop, step, name)
130111

@@ -161,7 +142,7 @@ def _simple_new(cls, start, stop=None, step=None, name=None,
161142
except TypeError:
162143
return Index(start, stop, step, name=name, **kwargs)
163144

164-
result._range = range(start, stop or 0, step or 1) # type: range
145+
result._range = range(start, stop or 0, step or 1)
165146

166147
result.name = name
167148
for k, v in kwargs.items():

0 commit comments

Comments
 (0)