Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
collect ensure_int into ensure_python_int
  • Loading branch information
topper-123 committed Jun 4, 2019
commit 228b5605b996987aa1729f3982d7ba8231fac761
29 changes: 29 additions & 0 deletions pandas/core/dtypes/common.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
""" common type operations """
from typing import Union
import warnings

import numpy as np
Expand Down Expand Up @@ -125,6 +126,34 @@ def ensure_int_or_float(arr: ArrayLike, copy=False) -> np.array:
return arr.astype('float64', copy=copy)


def ensure_python_int(value: Union[int, np.integer]) -> int:
"""
Ensure that a value is a python int.

Parameters
----------
value: int or numpy.integer

Returns
-------
int

Raises
------
TypeError: if the value isn't an int or can't be converted to one.
"""
if not is_scalar(value):
raise TypeError("Value needs to be a scalar value, was type {}"
.format(type(value)))
msg = "Wrong type {} for value {}"
try:
new_value = int(value)
assert (new_value == value)
except (TypeError, ValueError, AssertionError):
raise TypeError(msg.format(type(value), value))
return new_value


def classes(*klasses):
""" evaluate if the tipo is a subclass of the klasses """
return lambda tipo: issubclass(tipo, klasses)
Expand Down
41 changes: 11 additions & 30 deletions pandas/core/indexes/range.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@

from pandas.core.dtypes import concat as _concat
from pandas.core.dtypes.common import (
is_int64_dtype, is_integer, is_scalar, is_timedelta64_dtype)
ensure_python_int, is_int64_dtype, is_integer, is_scalar,
is_timedelta64_dtype)
from pandas.core.dtypes.generic import (
ABCDataFrame, ABCSeries, ABCTimedeltaIndex)

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

# validate the arguments
def ensure_int(value, field):
msg = ("RangeIndex(...) must be called with integers,"
" {value} was passed for {field}")
if not is_scalar(value):
raise TypeError(msg.format(value=type(value).__name__,
field=field))
try:
new_value = int(value)
assert(new_value == value)
except (TypeError, ValueError, AssertionError):
raise TypeError(msg.format(value=type(value).__name__,
field=field))
if com._all_none(start, stop, step):
raise TypeError("RangeIndex(...) must be called with integers")

return new_value
start = ensure_python_int(start) if start is not None else 0

if com._all_none(start, stop, step):
msg = "RangeIndex(...) must be called with integers"
raise TypeError(msg)
elif start is None:
start = 0
else:
start = ensure_int(start, 'start')
if stop is None:
stop = start
start = 0
start, stop = 0, start
else:
stop = ensure_int(stop, 'stop')
if step is None:
step = 1
elif step == 0:
stop = ensure_python_int(stop)

step = ensure_python_int(step) if step is not None else 1
if step == 0:
raise ValueError("Step must not be zero")
else:
step = ensure_int(step, 'step')

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

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

result._range = range(start, stop or 0, step or 1) # type: range
result._range = range(start, stop or 0, step or 1)

result.name = name
for k, v in kwargs.items():
Expand Down