Skip to content

Commit e9d79f1

Browse files
committed
decentralize unit tests, cite argument in error message, add unit tests for validation function
1 parent 6a33cb7 commit e9d79f1

File tree

18 files changed

+244
-220
lines changed

18 files changed

+244
-220
lines changed

pandas/computation/eval.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ def eval(expr, parser='pandas', engine=None, truediv=True,
233233
pandas.DataFrame.query
234234
pandas.DataFrame.eval
235235
"""
236-
inplace = _validate_bool_type(inplace)
236+
inplace = _validate_bool_type(inplace, 'inplace')
237237
first_expr = True
238238
if isinstance(expr, string_types):
239239
_check_expression(expr)

pandas/computation/tests/test_eval.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1970,6 +1970,15 @@ def test_negate_lt_eq_le():
19701970
for engine, parser in product(_engines, expr._parsers):
19711971
yield check_negate_lt_eq_le, engine, parser
19721972

1973+
class TestValidate(tm.TestCase):
1974+
1975+
def test_validate_bool_args(self):
1976+
invalid_values = [1, "True", [1,2,3], 5.0]
1977+
1978+
for value in invalid_values:
1979+
with self.assertRaises(ValueError):
1980+
pd.eval("2+2", inplace=value)
1981+
19731982

19741983
if __name__ == '__main__':
19751984
nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],

pandas/core/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1179,7 +1179,7 @@ def searchsorted(self, value, side='left', sorter=None):
11791179
False: 'first'})
11801180
@Appender(_shared_docs['drop_duplicates'] % _indexops_doc_kwargs)
11811181
def drop_duplicates(self, keep='first', inplace=False):
1182-
inplace = _validate_bool_type(inplace)
1182+
inplace = _validate_bool_type(inplace, 'inplace')
11831183
if isinstance(self, ABCIndexClass):
11841184
if self.is_unique:
11851185
return self._shallow_copy()

pandas/core/categorical.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ def set_ordered(self, value, inplace=False):
616616
Whether or not to set the ordered attribute inplace or return a copy
617617
of this categorical with ordered set to the value
618618
"""
619-
inplace = _validate_bool_type(inplace)
619+
inplace = _validate_bool_type(inplace, 'inplace')
620620
self._validate_ordered(value)
621621
cat = self if inplace else self.copy()
622622
cat._ordered = value
@@ -633,7 +633,7 @@ def as_ordered(self, inplace=False):
633633
Whether or not to set the ordered attribute inplace or return a copy
634634
of this categorical with ordered set to True
635635
"""
636-
return self.set_ordered(True, inplace=_validate_bool_type(inplace))
636+
return self.set_ordered(True, inplace=_validate_bool_type(inplace, 'inplace'))
637637

638638
def as_unordered(self, inplace=False):
639639
"""
@@ -645,7 +645,7 @@ def as_unordered(self, inplace=False):
645645
Whether or not to set the ordered attribute inplace or return a copy
646646
of this categorical with ordered set to False
647647
"""
648-
return self.set_ordered(False, inplace=_validate_bool_type(inplace))
648+
return self.set_ordered(False, inplace=_validate_bool_type(inplace, 'inplace'))
649649

650650
def _get_ordered(self):
651651
""" Gets the ordered attribute """
@@ -704,7 +704,7 @@ def set_categories(self, new_categories, ordered=None, rename=False,
704704
remove_categories
705705
remove_unused_categories
706706
"""
707-
inplace = _validate_bool_type(inplace)
707+
inplace = _validate_bool_type(inplace, 'inplace')
708708
new_categories = self._validate_categories(new_categories)
709709
cat = self if inplace else self.copy()
710710
if rename:
@@ -757,7 +757,7 @@ def rename_categories(self, new_categories, inplace=False):
757757
remove_unused_categories
758758
set_categories
759759
"""
760-
inplace = _validate_bool_type(inplace)
760+
inplace = _validate_bool_type(inplace, 'inplace')
761761
cat = self if inplace else self.copy()
762762
cat.categories = new_categories
763763
if not inplace:
@@ -798,7 +798,7 @@ def reorder_categories(self, new_categories, ordered=None, inplace=False):
798798
remove_unused_categories
799799
set_categories
800800
"""
801-
inplace = _validate_bool_type(inplace)
801+
inplace = _validate_bool_type(inplace, 'inplace')
802802
if set(self._categories) != set(new_categories):
803803
raise ValueError("items in new_categories are not the same as in "
804804
"old categories")
@@ -837,7 +837,7 @@ def add_categories(self, new_categories, inplace=False):
837837
remove_unused_categories
838838
set_categories
839839
"""
840-
inplace = _validate_bool_type(inplace)
840+
inplace = _validate_bool_type(inplace, 'inplace')
841841
if not is_list_like(new_categories):
842842
new_categories = [new_categories]
843843
already_included = set(new_categories) & set(self._categories)
@@ -883,7 +883,7 @@ def remove_categories(self, removals, inplace=False):
883883
remove_unused_categories
884884
set_categories
885885
"""
886-
inplace = _validate_bool_type(inplace)
886+
inplace = _validate_bool_type(inplace, 'inplace')
887887
if not is_list_like(removals):
888888
removals = [removals]
889889

@@ -924,7 +924,7 @@ def remove_unused_categories(self, inplace=False):
924924
remove_categories
925925
set_categories
926926
"""
927-
inplace = _validate_bool_type(inplace)
927+
inplace = _validate_bool_type(inplace, 'inplace')
928928
cat = self if inplace else self.copy()
929929
idx, inv = np.unique(cat._codes, return_inverse=True)
930930

@@ -1330,7 +1330,7 @@ def sort_values(self, inplace=False, ascending=True, na_position='last'):
13301330
[NaN, NaN, 5.0, 2.0, 2.0]
13311331
Categories (2, int64): [2, 5]
13321332
"""
1333-
inplace = _validate_bool_type(inplace)
1333+
inplace = _validate_bool_type(inplace, 'inplace')
13341334
if na_position not in ['last', 'first']:
13351335
raise ValueError('invalid na_position: {!r}'.format(na_position))
13361336

pandas/core/frame.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2164,7 +2164,7 @@ def query(self, expr, inplace=False, **kwargs):
21642164
>>> df.query('a > b')
21652165
>>> df[df.a > df.b] # same result as the previous expression
21662166
"""
2167-
inplace = _validate_bool_type(inplace)
2167+
inplace = _validate_bool_type(inplace, 'inplace')
21682168
if not isinstance(expr, compat.string_types):
21692169
msg = "expr must be a string to be evaluated, {0} given"
21702170
raise ValueError(msg.format(type(expr)))
@@ -2184,7 +2184,7 @@ def query(self, expr, inplace=False, **kwargs):
21842184
else:
21852185
return new_data
21862186

2187-
def eval(self, expr, inplace=True, **kwargs):
2187+
def eval(self, expr, inplace=None, **kwargs):
21882188
"""Evaluate an expression in the context of the calling DataFrame
21892189
instance.
21902190
@@ -2231,7 +2231,7 @@ def eval(self, expr, inplace=True, **kwargs):
22312231
>>> df.eval('a + b')
22322232
>>> df.eval('c = a + b')
22332233
"""
2234-
inplace = _validate_bool_type(inplace)
2234+
inplace = _validate_bool_type(inplace, 'inplace')
22352235
resolvers = kwargs.pop('resolvers', None)
22362236
kwargs['level'] = kwargs.pop('level', 0) + 1
22372237
if resolvers is None:
@@ -2845,7 +2845,7 @@ def set_index(self, keys, drop=True, append=False, inplace=False,
28452845
-------
28462846
dataframe : DataFrame
28472847
"""
2848-
inplace = _validate_bool_type(inplace)
2848+
inplace = _validate_bool_type(inplace, 'inplace')
28492849
if not isinstance(keys, list):
28502850
keys = [keys]
28512851

@@ -2938,7 +2938,7 @@ def reset_index(self, level=None, drop=False, inplace=False, col_level=0,
29382938
-------
29392939
resetted : DataFrame
29402940
"""
2941-
inplace = _validate_bool_type(inplace)
2941+
inplace = _validate_bool_type(inplace, 'inplace')
29422942
if inplace:
29432943
new_obj = self
29442944
else:
@@ -3043,7 +3043,7 @@ def dropna(self, axis=0, how='any', thresh=None, subset=None,
30433043
-------
30443044
dropped : DataFrame
30453045
"""
3046-
inplace = _validate_bool_type(inplace)
3046+
inplace = _validate_bool_type(inplace, 'inplace')
30473047
if isinstance(axis, (tuple, list)):
30483048
result = self
30493049
for ax in axis:
@@ -3107,7 +3107,7 @@ def drop_duplicates(self, subset=None, keep='first', inplace=False):
31073107
-------
31083108
deduplicated : DataFrame
31093109
"""
3110-
inplace = _validate_bool_type(inplace)
3110+
inplace = _validate_bool_type(inplace, 'inplace')
31113111
duplicated = self.duplicated(subset, keep=keep)
31123112

31133113
if inplace:
@@ -3169,7 +3169,7 @@ def f(vals):
31693169
@Appender(_shared_docs['sort_values'] % _shared_doc_kwargs)
31703170
def sort_values(self, by, axis=0, ascending=True, inplace=False,
31713171
kind='quicksort', na_position='last'):
3172-
inplace = _validate_bool_type(inplace)
3172+
inplace = _validate_bool_type(inplace, 'inplace')
31733173
axis = self._get_axis_number(axis)
31743174
other_axis = 0 if axis == 1 else 1
31753175

@@ -3280,7 +3280,7 @@ def sort(self, columns=None, axis=0, ascending=True, inplace=False,
32803280
def sort_index(self, axis=0, level=None, ascending=True, inplace=False,
32813281
kind='quicksort', na_position='last', sort_remaining=True,
32823282
by=None):
3283-
inplace = _validate_bool_type(inplace)
3283+
inplace = _validate_bool_type(inplace, 'inplace')
32843284
# 10726
32853285
if by is not None:
32863286
warnings.warn("by argument to sort_index is deprecated, pls use "

pandas/core/generic.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ def rename_axis(self, mapper, axis=0, copy=True, inplace=False):
734734
1 2 5
735735
2 3 6
736736
"""
737-
inplace = _validate_bool_type(inplace)
737+
inplace = _validate_bool_type(inplace, 'inplace')
738738
non_mapper = is_scalar(mapper) or (is_list_like(mapper) and not
739739
is_dict_like(mapper))
740740
if non_mapper:
@@ -1952,7 +1952,7 @@ def drop(self, labels, axis=0, level=None, inplace=False, errors='raise'):
19521952
-------
19531953
dropped : type of caller
19541954
"""
1955-
inplace = _validate_bool_type(inplace)
1955+
inplace = _validate_bool_type(inplace, 'inplace')
19561956
axis = self._get_axis_number(axis)
19571957
axis_name = self._get_axis_name(axis)
19581958
axis, axis_ = self._get_axis(axis), axis
@@ -2102,7 +2102,7 @@ def sort_values(self, by, axis=0, ascending=True, inplace=False,
21022102
@Appender(_shared_docs['sort_index'] % dict(axes="axes", klass="NDFrame"))
21032103
def sort_index(self, axis=0, level=None, ascending=True, inplace=False,
21042104
kind='quicksort', na_position='last', sort_remaining=True):
2105-
inplace = _validate_bool_type(inplace)
2105+
inplace = _validate_bool_type(inplace, 'inplace')
21062106
axis = self._get_axis_number(axis)
21072107
axis_name = self._get_axis_name(axis)
21082108
labels = self._get_axis(axis)
@@ -2876,7 +2876,7 @@ def consolidate(self, inplace=False):
28762876
-------
28772877
consolidated : type of caller
28782878
"""
2879-
inplace = _validate_bool_type(inplace)
2879+
inplace = _validate_bool_type(inplace, 'inplace')
28802880
if inplace:
28812881
self._consolidate_inplace()
28822882
else:
@@ -3272,7 +3272,7 @@ def convert_objects(self, convert_dates=True, convert_numeric=False,
32723272
@Appender(_shared_docs['fillna'] % _shared_doc_kwargs)
32733273
def fillna(self, value=None, method=None, axis=None, inplace=False,
32743274
limit=None, downcast=None):
3275-
inplace = _validate_bool_type(inplace)
3275+
inplace = _validate_bool_type(inplace, 'inplace')
32763276
if isinstance(value, (list, tuple)):
32773277
raise TypeError('"value" parameter must be a scalar or dict, but '
32783278
'you passed a "{0}"'.format(type(value).__name__))
@@ -3485,7 +3485,7 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None,
34853485
and play with this method to gain intuition about how it works.
34863486
34873487
"""
3488-
inplace = _validate_bool_type(inplace)
3488+
inplace = _validate_bool_type(inplace, 'inplace')
34893489
if not is_bool(regex) and to_replace is not None:
34903490
raise AssertionError("'to_replace' must be 'None' if 'regex' is "
34913491
"not a bool")
@@ -3721,7 +3721,7 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False,
37213721
"""
37223722
Interpolate values according to different methods.
37233723
"""
3724-
inplace = _validate_bool_type(inplace)
3724+
inplace = _validate_bool_type(inplace, 'inplace')
37253725

37263726
if self.ndim > 2:
37273727
raise NotImplementedError("Interpolate has not been implemented "
@@ -4635,7 +4635,7 @@ def _where(self, cond, other=np.nan, inplace=False, axis=None, level=None,
46354635
Equivalent to public method `where`, except that `other` is not
46364636
applied as a function even if callable. Used in __setitem__.
46374637
"""
4638-
inplace = _validate_bool_type(inplace)
4638+
inplace = _validate_bool_type(inplace, 'inplace')
46394639

46404640
cond = com._apply_if_callable(cond, self)
46414641

@@ -4903,7 +4903,7 @@ def where(self, cond, other=np.nan, inplace=False, axis=None, level=None,
49034903
def mask(self, cond, other=np.nan, inplace=False, axis=None, level=None,
49044904
try_cast=False, raise_on_error=True):
49054905

4906-
inplace = _validate_bool_type(inplace)
4906+
inplace = _validate_bool_type(inplace, 'inplace')
49074907
cond = com._apply_if_callable(cond, self)
49084908

49094909
return self.where(~cond, other=other, inplace=inplace, axis=axis,

pandas/core/internals.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ def fillna(self, value, limit=None, inplace=False, downcast=None,
361361
""" fillna on the block with the value. If we fail, then convert to
362362
ObjectBlock and try again
363363
"""
364-
inplace = _validate_bool_type(inplace)
364+
inplace = _validate_bool_type(inplace, 'inplace')
365365

366366
if not self._can_hold_na:
367367
if inplace:
@@ -628,7 +628,7 @@ def replace(self, to_replace, value, inplace=False, filter=None,
628628
compatibility.
629629
"""
630630

631-
inplace = _validate_bool_type(inplace)
631+
inplace = _validate_bool_type(inplace, 'inplace')
632632
original_to_replace = to_replace
633633
mask = isnull(self.values)
634634
# try to replace, if we raise an error, convert to ObjectBlock and
@@ -901,7 +901,7 @@ def interpolate(self, method='pad', axis=0, index=None, values=None,
901901
fill_value=None, coerce=False, downcast=None, mgr=None,
902902
**kwargs):
903903

904-
inplace = _validate_bool_type(inplace)
904+
inplace = _validate_bool_type(inplace, 'inplace')
905905

906906
def check_int_bool(self, inplace):
907907
# Only FloatBlocks will contain NaNs.
@@ -950,7 +950,7 @@ def _interpolate_with_fill(self, method='pad', axis=0, inplace=False,
950950
downcast=None, mgr=None):
951951
""" fillna but using the interpolate machinery """
952952

953-
inplace = _validate_bool_type(inplace)
953+
inplace = _validate_bool_type(inplace, 'inplace')
954954

955955
# if we are coercing, then don't force the conversion
956956
# if the block can't hold the type
@@ -978,7 +978,7 @@ def _interpolate(self, method=None, index=None, values=None,
978978
mgr=None, **kwargs):
979979
""" interpolate using scipy wrappers """
980980

981-
inplace = _validate_bool_type(inplace)
981+
inplace = _validate_bool_type(inplace, 'inplace')
982982
data = self.values if inplace else self.values.copy()
983983

984984
# only deal with floats
@@ -1523,7 +1523,7 @@ def putmask(self, mask, new, align=True, inplace=False, axis=0,
15231523
-------
15241524
a new block(s), the result of the putmask
15251525
"""
1526-
inplace = _validate_bool_type(inplace)
1526+
inplace = _validate_bool_type(inplace, 'inplace')
15271527

15281528
# use block's copy logic.
15291529
# .values may be an Index which does shallow copy by default
@@ -1810,12 +1810,8 @@ def should_store(self, value):
18101810
return issubclass(value.dtype.type, np.bool_)
18111811

18121812
def replace(self, to_replace, value, inplace=False, filter=None,
1813-
<<<<<<< 141e128c7987751deda752d57fb676c90b1e18db
18141813
regex=False, convert=True, mgr=None):
1815-
=======
1816-
regex=False, mgr=None):
1817-
inplace = _validate_bool_type(inplace)
1818-
>>>>>>> move validation function into pandas.types.validate and point all instances there
1814+
inplace = _validate_bool_type(inplace, 'inplace')
18191815
to_replace_values = np.atleast_1d(to_replace)
18201816
if not np.can_cast(to_replace_values, bool):
18211817
return self
@@ -1997,7 +1993,8 @@ def replace(self, to_replace, value, inplace=False, filter=None,
19971993

19981994
def _replace_single(self, to_replace, value, inplace=False, filter=None,
19991995
regex=False, convert=True, mgr=None):
2000-
inplace = _validate_bool_type(inplace)
1996+
1997+
inplace = _validate_bool_type(inplace, 'inplace')
20011998

20021999
# to_replace is regex compilable
20032000
to_rep_re = regex and is_re_compilable(to_replace)
@@ -3222,7 +3219,7 @@ def replace_list(self, src_list, dest_list, inplace=False, regex=False,
32223219
mgr=None):
32233220
""" do a list replace """
32243221

3225-
inplace = _validate_bool_type(inplace)
3222+
inplace = _validate_bool_type(inplace, 'inplace')
32263223

32273224
if mgr is None:
32283225
mgr = self

0 commit comments

Comments
 (0)