Skip to content

Commit 3809d87

Browse files
committed
CLN: Refactor Index names validation
1 parent 787ab55 commit 3809d87

File tree

2 files changed

+26
-18
lines changed

2 files changed

+26
-18
lines changed

pandas/core/indexes/base.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,13 @@ def copy(self, name=None, deep=False, dtype=None, **kwargs):
785785
new_index = self._shallow_copy()
786786

787787
names = kwargs.get('names')
788-
names = self._validate_names(name=name, names=names, deep=deep)
788+
789+
if name is None and names is None:
790+
from copy import deepcopy
791+
names = deepcopy(self.names) if deep else self.names
792+
else:
793+
names = self._validate_names(name=name, names=names)
794+
789795
new_index = new_index.set_names(names)
790796

791797
if dtype:
@@ -800,24 +806,21 @@ def __deepcopy__(self, memo=None):
800806
memo = {}
801807
return self.copy(deep=True)
802808

803-
def _validate_names(self, name=None, names=None, deep=False):
809+
def _validate_names(self, name=None, names=None):
804810
"""
805-
Handles the quirks of having a singular 'name' parameter for general
806-
Index and plural 'names' parameter for MultiIndex.
811+
Returns valid `names` considering both `names` and `name`
812+
or raises TypeError in case of wrong arguments passed.
807813
"""
808-
from copy import deepcopy
809814
if names is not None and name is not None:
810-
raise TypeError("Can only provide one of `names` and `name`")
811-
elif names is None and name is None:
812-
return deepcopy(self.names) if deep else self.names
813-
elif names is not None:
814-
if not is_list_like(names):
815-
raise TypeError("Must pass list-like as `names`.")
816-
return names
817-
else:
818-
if not is_list_like(name):
819-
return [name]
820-
return name
815+
raise TypeError("Can provide only one of names and name arguments")
816+
817+
if names is not None and not is_list_like(names):
818+
raise TypeError("names must be list-like")
819+
820+
if name is not None:
821+
return name if is_list_like(name) else [name]
822+
823+
return names
821824

822825
def __unicode__(self):
823826
"""

pandas/core/indexes/multi.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -427,11 +427,16 @@ def copy(self, names=None, dtype=None, levels=None, labels=None,
427427
``deep``, but if ``deep`` is passed it will attempt to deepcopy.
428428
This could be potentially expensive on large MultiIndex objects.
429429
"""
430+
from copy import deepcopy
431+
430432
name = kwargs.get('name')
431-
names = self._validate_names(name=name, names=names, deep=deep)
433+
434+
if name is None and names is None:
435+
names = deepcopy(self.names) if deep else self.names
436+
else:
437+
names = self._validate_names(name=name, names=names)
432438

433439
if deep:
434-
from copy import deepcopy
435440
if levels is None:
436441
levels = deepcopy(self.levels)
437442
if labels is None:

0 commit comments

Comments
 (0)