Skip to content

Commit 6dd8308

Browse files
BUG: adds validation for boolean keywords in DataFrame.set_index
ENH: Adds util._validators.validate_keywords_as_bool decorator
1 parent 7495e9a commit 6dd8308

File tree

4 files changed

+42
-2
lines changed

4 files changed

+42
-2
lines changed

doc/source/whatsnew/v0.22.0.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,5 +162,5 @@ Other
162162
^^^^^
163163

164164
- Improved error message when attempting to use a Python keyword as an identifier in a numexpr query (:issue:`18221`)
165-
-
165+
- Added checking of boolean kwards in DataFrame methods (:issue:`16714`)
166166
-

pandas/core/frame.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
from pandas.util._decorators import (Appender, Substitution,
8686
rewrite_axis_style_signature)
8787
from pandas.util._validators import (validate_bool_kwarg,
88+
validate_keywords_as_bool,
8889
validate_axis_style_args)
8990

9091
from pandas.core.indexes.period import PeriodIndex
@@ -3037,6 +3038,7 @@ def shift(self, periods=1, freq=None, axis=0):
30373038
return super(DataFrame, self).shift(periods=periods, freq=freq,
30383039
axis=axis)
30393040

3041+
@validate_keywords_as_bool('drop', 'append', 'inplace', 'verify_integrity')
30403042
def set_index(self, keys, drop=True, append=False, inplace=False,
30413043
verify_integrity=False):
30423044
"""
@@ -3102,7 +3104,6 @@ def set_index(self, keys, drop=True, append=False, inplace=False,
31023104
-------
31033105
dataframe : DataFrame
31043106
"""
3105-
inplace = validate_bool_kwarg(inplace, 'inplace')
31063107
if not isinstance(keys, list):
31073108
keys = [keys]
31083109

pandas/tests/frame/test_validate.py

+8
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,11 @@ def test_validate_bool_args(self, dataframe, func, inplace):
3131

3232
with tm.assert_raises_regex(ValueError, msg):
3333
getattr(dataframe, func)(**kwargs)
34+
35+
@pytest.mark.parametrize('keyword', ('drop', 'append', 'inplace',
36+
'verify_integrity'))
37+
def test_set_index_validation(self, dataframe, keyword):
38+
msg = 'For argument "{}" expected type bool'.format(keyword)
39+
kw = {keyword: 'yes please'}
40+
with tm.assert_raises_regex(ValueError, msg):
41+
dataframe.set_index('b', **kw)

pandas/util/_validators.py

+31
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
Module that contains many useful utilities
33
for validating data or function arguments
44
"""
5+
import functools
56
import warnings
67

78
from pandas.core.dtypes.common import is_bool
@@ -320,3 +321,33 @@ def validate_axis_style_args(data, args, kwargs, arg_name, method_name):
320321
msg = "Cannot specify all of '{}', 'index', 'columns'."
321322
raise TypeError(msg.format(arg_name))
322323
return out
324+
325+
326+
def validate_keywords_as_bool(*keywords):
327+
"""For a list of keywords, ensure all are bool
328+
329+
Usage
330+
-----
331+
Designed to be used as decorator around methods to check many
332+
keywords at once:
333+
334+
@validate_keywords_as_bool('inplace', 'append')
335+
def set_index(self, keys, inplace=False, append=False):
336+
etc.
337+
338+
See Also
339+
--------
340+
validate_bool_kwargs
341+
342+
"""
343+
keywords = set(keywords)
344+
345+
def validate_kwargs(func):
346+
@functools.wraps(func)
347+
def validator(*args, **kwargs):
348+
# only validate present keywords
349+
for kw in keywords.intersection(kwargs.keys()):
350+
validate_bool_kwarg(kwargs[kw], kw)
351+
return func(*args, **kwargs)
352+
return validator
353+
return validate_kwargs

0 commit comments

Comments
 (0)