Skip to content

Commit 8830e85

Browse files
jbrockmendeljreback
authored andcommitted
REF: pytables remove IndexCol.infer, move attr setting to constructors (#30142)
1 parent facd756 commit 8830e85

File tree

1 file changed

+74
-34
lines changed

1 file changed

+74
-34
lines changed

pandas/io/pytables.py

+74-34
Original file line numberDiff line numberDiff line change
@@ -1895,6 +1895,9 @@ def __init__(
18951895
freq=None,
18961896
tz=None,
18971897
index_name=None,
1898+
table=None,
1899+
meta=None,
1900+
metadata=None,
18981901
):
18991902

19001903
if not isinstance(name, str):
@@ -1910,9 +1913,9 @@ def __init__(
19101913
self.freq = freq
19111914
self.tz = tz
19121915
self.index_name = index_name
1913-
self.table = None
1914-
self.meta = None
1915-
self.metadata = None
1916+
self.table = table
1917+
self.meta = meta
1918+
self.metadata = metadata
19161919

19171920
if pos is not None:
19181921
self.set_pos(pos)
@@ -1968,19 +1971,6 @@ def is_indexed(self) -> bool:
19681971
# 'error: "None" has no attribute "cols"'
19691972
return getattr(self.table.cols, self.cname).is_indexed # type: ignore
19701973

1971-
def copy(self):
1972-
new_self = copy.copy(self)
1973-
return new_self
1974-
1975-
def infer(self, handler: "Table"):
1976-
"""infer this column from the table: create and return a new object"""
1977-
table = handler.table
1978-
new_self = self.copy()
1979-
new_self.table = table
1980-
new_self.get_attr()
1981-
new_self.read_metadata(handler)
1982-
return new_self
1983-
19841974
def convert(self, values: np.ndarray, nan_rep, encoding: str, errors: str):
19851975
""" set the values from this selection: take = take ownership """
19861976
assert isinstance(values, np.ndarray), type(values)
@@ -2136,10 +2126,6 @@ def set_attr(self):
21362126
""" set the kind for this column """
21372127
setattr(self.attrs, self.kind_attr, self.kind)
21382128

2139-
def read_metadata(self, handler):
2140-
""" retrieve the metadata for this columns """
2141-
self.metadata = handler.read_metadata(self.cname)
2142-
21432129
def validate_metadata(self, handler: "AppendableTable"):
21442130
""" validate that kind=category does not change the categories """
21452131
if self.meta == "category":
@@ -2207,10 +2193,27 @@ class DataCol(IndexCol):
22072193
_info_fields = ["tz", "ordered"]
22082194

22092195
def __init__(
2210-
self, name: str, values=None, kind=None, typ=None, cname=None, pos=None,
2196+
self,
2197+
name: str,
2198+
values=None,
2199+
kind=None,
2200+
typ=None,
2201+
cname=None,
2202+
pos=None,
2203+
table=None,
2204+
meta=None,
2205+
metadata=None,
22112206
):
22122207
super().__init__(
2213-
name=name, values=values, kind=kind, typ=typ, pos=pos, cname=cname
2208+
name=name,
2209+
values=values,
2210+
kind=kind,
2211+
typ=typ,
2212+
pos=pos,
2213+
cname=cname,
2214+
table=table,
2215+
meta=meta,
2216+
metadata=metadata,
22142217
)
22152218
self.dtype = None
22162219
self.data = None
@@ -3420,10 +3423,8 @@ def get_attrs(self):
34203423
self.encoding = _ensure_encoding(getattr(self.attrs, "encoding", None))
34213424
self.errors = _ensure_decoded(getattr(self.attrs, "errors", "strict"))
34223425
self.levels = getattr(self.attrs, "levels", None) or []
3423-
self.index_axes = [a.infer(self) for a in self.indexables if a.is_an_indexable]
3424-
self.values_axes = [
3425-
a.infer(self) for a in self.indexables if not a.is_an_indexable
3426-
]
3426+
self.index_axes = [a for a in self.indexables if a.is_an_indexable]
3427+
self.values_axes = [a for a in self.indexables if not a.is_an_indexable]
34273428
self.metadata = getattr(self.attrs, "metadata", None) or []
34283429

34293430
def validate_version(self, where=None):
@@ -3466,7 +3467,18 @@ def indexables(self):
34663467
# index columns
34673468
for i, (axis, name) in enumerate(self.attrs.index_cols):
34683469
atom = getattr(desc, name)
3469-
index_col = IndexCol(name=name, axis=axis, pos=i, typ=atom)
3470+
md = self.read_metadata(name)
3471+
meta = "category" if md is not None else None
3472+
index_col = IndexCol(
3473+
name=name,
3474+
axis=axis,
3475+
pos=i,
3476+
typ=atom,
3477+
table=self.table,
3478+
meta=meta,
3479+
metadata=md,
3480+
)
3481+
index_col.get_attr()
34703482
_indexables.append(index_col)
34713483

34723484
# values columns
@@ -3481,7 +3493,19 @@ def f(i, c):
34813493

34823494
atom = getattr(desc, c)
34833495
adj_name = _maybe_adjust_name(c, self.version)
3484-
return klass(name=adj_name, cname=c, pos=base_pos + i, typ=atom)
3496+
md = self.read_metadata(c)
3497+
meta = "category" if md is not None else None
3498+
obj = klass(
3499+
name=adj_name,
3500+
cname=c,
3501+
pos=base_pos + i,
3502+
typ=atom,
3503+
table=self.table,
3504+
meta=meta,
3505+
metadata=md,
3506+
)
3507+
obj.get_attr()
3508+
return obj
34853509

34863510
# Note: the definition of `values_cols` ensures that each
34873511
# `c` below is a str.
@@ -4474,10 +4498,8 @@ def get_attrs(self):
44744498
self.nan_rep = None
44754499
self.levels = []
44764500

4477-
self.index_axes = [a.infer(self) for a in self.indexables if a.is_an_indexable]
4478-
self.values_axes = [
4479-
a.infer(self) for a in self.indexables if not a.is_an_indexable
4480-
]
4501+
self.index_axes = [a for a in self.indexables if a.is_an_indexable]
4502+
self.values_axes = [a for a in self.indexables if not a.is_an_indexable]
44814503
self.data_columns = [a.name for a in self.values_axes]
44824504

44834505
@cache_readonly
@@ -4488,13 +4510,31 @@ def indexables(self):
44884510
# TODO: can we get a typ for this? AFAICT it is the only place
44894511
# where we aren't passing one
44904512
# the index columns is just a simple index
4491-
_indexables = [GenericIndexCol(name="index", axis=0)]
4513+
md = self.read_metadata("index")
4514+
meta = "category" if md is not None else None
4515+
index_col = GenericIndexCol(
4516+
name="index", axis=0, table=self.table, meta=meta, metadata=md
4517+
)
4518+
index_col.get_attr()
4519+
4520+
_indexables = [index_col]
44924521

44934522
for i, n in enumerate(d._v_names):
44944523
assert isinstance(n, str)
44954524

44964525
atom = getattr(d, n)
4497-
dc = GenericDataIndexableCol(name=n, pos=i, values=[n], typ=atom)
4526+
md = self.read_metadata(n)
4527+
meta = "category" if md is not None else None
4528+
dc = GenericDataIndexableCol(
4529+
name=n,
4530+
pos=i,
4531+
values=[n],
4532+
typ=atom,
4533+
table=self.table,
4534+
meta=meta,
4535+
metadata=md,
4536+
)
4537+
dc.get_attr()
44984538
_indexables.append(dc)
44994539

45004540
return _indexables

0 commit comments

Comments
 (0)