From 747bae00176182b25eb377d0fb71cfd525d90620 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sun, 17 Nov 2019 18:33:46 -0800 Subject: [PATCH 01/15] add types --- pandas/io/pytables.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 193b8f5053d65..ea88efed15de3 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -1077,7 +1077,14 @@ def append( self._write_to_group(key, value, append=append, dropna=dropna, **kwargs) def append_to_multiple( - self, d, value, selector, data_columns=None, axes=None, dropna=False, **kwargs + self, + d: Dict, + value, + selector, + data_columns=None, + axes=None, + dropna: bool = False, + **kwargs, ): """ Append to multiple tables @@ -1123,7 +1130,7 @@ def append_to_multiple( # figure out how to split the value remain_key = None - remain_values = [] + remain_values: List = [] for k, v in d.items(): if v is None: if remain_key is not None: @@ -1385,7 +1392,7 @@ def _check_if_open(self): if not self.is_open: raise ClosedFileError("{0} file is not open!".format(self._path)) - def _validate_format(self, format, kwargs): + def _validate_format(self, format: str, kwargs: Dict[str, Any]) -> Dict[str, Any]: """ validate / deprecate formats; return the new kwargs """ kwargs = kwargs.copy() @@ -2082,6 +2089,7 @@ def __init__( self.meta_attr = "{name}_meta".format(name=self.name) self.set_data(data) self.set_metadata(metadata) + assert isinstance(self.cname, str), type(self.cname) def __repr__(self) -> str: temp = tuple( @@ -3225,6 +3233,8 @@ class Table(Fixed): is_table = True is_shape_reversed = False + data_columns: List[str] + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.index_axes = [] @@ -3237,7 +3247,7 @@ def __init__(self, *args, **kwargs): self.selection = None @property - def table_type_short(self): + def table_type_short(self) -> str: return self.table_type.split("_")[0] @property @@ -3311,7 +3321,7 @@ def validate(self, other): ) @property - def is_multi_index(self): + def is_multi_index(self) -> bool: """the levels attribute is 1 or a list in the case of a multi-index""" return isinstance(self.levels, list) @@ -3335,7 +3345,7 @@ def validate_multiindex(self, obj): ) @property - def nrows_expected(self): + def nrows_expected(self) -> int: """ based on our axes, compute the expected nrows """ return np.prod([i.cvalues.shape[0] for i in self.index_axes]) @@ -3433,7 +3443,7 @@ def write_metadata(self, key, values): nan_rep=self.nan_rep, ) - def read_metadata(self, key): + def read_metadata(self, key: str): """ return the meta data array for this key """ if getattr(getattr(self.group, "meta", None), key, None) is not None: return self.parent.select(self._get_metadata_path(key)) @@ -4179,7 +4189,7 @@ def write( # add the rows self.write_data(chunksize, dropna=dropna) - def write_data(self, chunksize, dropna=False): + def write_data(self, chunksize, dropna: bool = False): """ we form the data into a 2-d including indexes,values,mask write chunk-by-chunk """ From a748f43049d88dd93c0938fb59435fd3c41abdca Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sun, 17 Nov 2019 18:37:46 -0800 Subject: [PATCH 02/15] types --- pandas/io/pytables.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index ea88efed15de3..06d0f03ebc14a 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -520,7 +520,7 @@ def root(self): def filename(self): return self._path - def __getitem__(self, key): + def __getitem__(self, key: str): return self.get(key) def __setitem__(self, key, value): @@ -529,7 +529,7 @@ def __setitem__(self, key, value): def __delitem__(self, key): return self.remove(key) - def __getattr__(self, name): + def __getattr__(self, name: str): """ allow attribute access to get stores """ try: return self.get(name) @@ -943,13 +943,13 @@ def func(_start, _stop, _where): return it.get_result(coordinates=True) - def put(self, key, value, format=None, append=False, **kwargs): + def put(self, key: str, value, format=None, append=False, **kwargs): """ Store object in HDFStore. Parameters ---------- - key : object + key : str value : {Series, DataFrame} format : 'fixed(f)|table(t)', default is 'fixed' fixed(f) : Fixed format @@ -1028,7 +1028,14 @@ def remove(self, key: str, where=None, start=None, stop=None): return s.delete(where=where, start=start, stop=stop) def append( - self, key, value, format=None, append=True, columns=None, dropna=None, **kwargs + self, + key: str, + value, + format=None, + append=True, + columns=None, + dropna=None, + **kwargs, ): """ Append to Table in file. Node must already exist and be Table @@ -1036,7 +1043,7 @@ def append( Parameters ---------- - key : object + key : str value : {Series, DataFrame} format : 'table' is the default table(t) : table format From 59243d596032892aba3049f1db178279a301a753 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sun, 17 Nov 2019 18:47:07 -0800 Subject: [PATCH 03/15] types --- pandas/io/pytables.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 06d0f03ebc14a..67e6995b0f5bb 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -2096,7 +2096,8 @@ def __init__( self.meta_attr = "{name}_meta".format(name=self.name) self.set_data(data) self.set_metadata(metadata) - assert isinstance(self.cname, str), type(self.cname) + # self.cname is a str here in all test cases but one, and that is a + # call inside a pytest.raises context def __repr__(self) -> str: temp = tuple( @@ -3241,6 +3242,7 @@ class Table(Fixed): is_shape_reversed = False data_columns: List[str] + selection: Optional["Selection"] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -4569,7 +4571,7 @@ class AppendableMultiFrameTable(AppendableFrameTable): _re_levels = re.compile(r"^level_\d+$") @property - def table_type_short(self): + def table_type_short(self) -> str: return "appendable_multi" def write(self, obj, data_columns=None, **kwargs): From 4a7b04a2cadc56d5af2cf824e4f650ceed63ffec Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sun, 17 Nov 2019 19:33:46 -0800 Subject: [PATCH 04/15] types --- pandas/io/pytables.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 67e6995b0f5bb..2353297a2a92e 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -523,10 +523,10 @@ def filename(self): def __getitem__(self, key: str): return self.get(key) - def __setitem__(self, key, value): + def __setitem__(self, key: str, value): self.put(key, value) - def __delitem__(self, key): + def __delitem__(self, key: str): return self.remove(key) def __getattr__(self, name: str): @@ -3411,7 +3411,7 @@ def queryables(self): [(a.cname, a) for a in self.index_axes] + [ (self.storage_obj_type._AXIS_NAMES[axis], None) - for axis, values in self.non_index_axes + for axis, _ in self.non_index_axes ] + [ (v.cname, v) From 34b1b30a254fddffab2498540308d6e46ab513d5 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sun, 17 Nov 2019 19:37:51 -0800 Subject: [PATCH 05/15] types --- pandas/io/pytables.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 2353297a2a92e..6a021f2d62bb2 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -1032,7 +1032,7 @@ def append( key: str, value, format=None, - append=True, + append: bool = True, columns=None, dropna=None, **kwargs, @@ -1510,8 +1510,8 @@ def _write_to_group( key: str, value, format, - index=True, - append=False, + index: bool = True, + append: bool = False, complib=None, encoding=None, **kwargs, From 4fe1e5e68733ffe7067d06978c1fdcb5b30ed80c Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sun, 17 Nov 2019 19:47:13 -0800 Subject: [PATCH 06/15] types --- pandas/io/pytables.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 6a021f2d62bb2..bf3149a90c41f 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -1801,7 +1801,7 @@ def copy(self): new_self = copy.copy(self) return new_self - def infer(self, handler): + def infer(self, handler: "Table"): """infer this column from the table: create and return a new object""" table = handler.table new_self = self.copy() @@ -2969,7 +2969,7 @@ def read_index_node(self, node, start=None, stop=None): return name, index - def write_array_empty(self, key, value): + def write_array_empty(self, key: str, value): """ write a 0-len array """ # ugly hack for length 0 axes @@ -2982,7 +2982,7 @@ def _is_empty_array(self, shape) -> bool: """Returns true if any axis is zero length.""" return any(x == 0 for x in shape) - def write_array(self, key, value, items=None): + def write_array(self, key: str, value, items=None): if key in self.group: self._handle.remove_node(self.group, key) @@ -3068,7 +3068,7 @@ def write_array(self, key, value, items=None): class LegacyFixed(GenericFixed): - def read_index_legacy(self, key, start=None, stop=None): + def read_index_legacy(self, key: str, start=None, stop=None): node = getattr(self.group, key) data = node[start:stop] kind = node._v_attrs.kind @@ -3581,6 +3581,8 @@ def create_index(self, columns=None, optlevel=None, kind=None): columns = [a.cname for a in self.axes if a.is_data_indexable] if not isinstance(columns, (tuple, list)): columns = [columns] + # At this point we must have all-str columns, or else we will + # raise in getattr below. kw = dict() if optlevel is not None: From fe0dde65b7a0aaa1cd7ef72ef3ede1d9280b3b63 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Sun, 17 Nov 2019 20:07:21 -0800 Subject: [PATCH 07/15] annotation --- pandas/io/pytables.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index bf3149a90c41f..55699b7b800a5 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -4552,6 +4552,7 @@ def indexables(self): self._indexables = [GenericIndexCol(name="index", axis=0)] for i, n in enumerate(d._v_names): + n: str # _v_names should all be strings dc = GenericDataIndexableCol( name=n, pos=i, values=[n], version=self.version From 50e9455e1a5ab75d3c1c0e097ac784a2cfb38b5e Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 18 Nov 2019 08:21:46 -0800 Subject: [PATCH 08/15] revert --- pandas/io/pytables.py | 70 +++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 46 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 55699b7b800a5..193b8f5053d65 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -520,16 +520,16 @@ def root(self): def filename(self): return self._path - def __getitem__(self, key: str): + def __getitem__(self, key): return self.get(key) - def __setitem__(self, key: str, value): + def __setitem__(self, key, value): self.put(key, value) - def __delitem__(self, key: str): + def __delitem__(self, key): return self.remove(key) - def __getattr__(self, name: str): + def __getattr__(self, name): """ allow attribute access to get stores """ try: return self.get(name) @@ -943,13 +943,13 @@ def func(_start, _stop, _where): return it.get_result(coordinates=True) - def put(self, key: str, value, format=None, append=False, **kwargs): + def put(self, key, value, format=None, append=False, **kwargs): """ Store object in HDFStore. Parameters ---------- - key : str + key : object value : {Series, DataFrame} format : 'fixed(f)|table(t)', default is 'fixed' fixed(f) : Fixed format @@ -1028,14 +1028,7 @@ def remove(self, key: str, where=None, start=None, stop=None): return s.delete(where=where, start=start, stop=stop) def append( - self, - key: str, - value, - format=None, - append: bool = True, - columns=None, - dropna=None, - **kwargs, + self, key, value, format=None, append=True, columns=None, dropna=None, **kwargs ): """ Append to Table in file. Node must already exist and be Table @@ -1043,7 +1036,7 @@ def append( Parameters ---------- - key : str + key : object value : {Series, DataFrame} format : 'table' is the default table(t) : table format @@ -1084,14 +1077,7 @@ def append( self._write_to_group(key, value, append=append, dropna=dropna, **kwargs) def append_to_multiple( - self, - d: Dict, - value, - selector, - data_columns=None, - axes=None, - dropna: bool = False, - **kwargs, + self, d, value, selector, data_columns=None, axes=None, dropna=False, **kwargs ): """ Append to multiple tables @@ -1137,7 +1123,7 @@ def append_to_multiple( # figure out how to split the value remain_key = None - remain_values: List = [] + remain_values = [] for k, v in d.items(): if v is None: if remain_key is not None: @@ -1399,7 +1385,7 @@ def _check_if_open(self): if not self.is_open: raise ClosedFileError("{0} file is not open!".format(self._path)) - def _validate_format(self, format: str, kwargs: Dict[str, Any]) -> Dict[str, Any]: + def _validate_format(self, format, kwargs): """ validate / deprecate formats; return the new kwargs """ kwargs = kwargs.copy() @@ -1510,8 +1496,8 @@ def _write_to_group( key: str, value, format, - index: bool = True, - append: bool = False, + index=True, + append=False, complib=None, encoding=None, **kwargs, @@ -1801,7 +1787,7 @@ def copy(self): new_self = copy.copy(self) return new_self - def infer(self, handler: "Table"): + def infer(self, handler): """infer this column from the table: create and return a new object""" table = handler.table new_self = self.copy() @@ -2096,8 +2082,6 @@ def __init__( self.meta_attr = "{name}_meta".format(name=self.name) self.set_data(data) self.set_metadata(metadata) - # self.cname is a str here in all test cases but one, and that is a - # call inside a pytest.raises context def __repr__(self) -> str: temp = tuple( @@ -2969,7 +2953,7 @@ def read_index_node(self, node, start=None, stop=None): return name, index - def write_array_empty(self, key: str, value): + def write_array_empty(self, key, value): """ write a 0-len array """ # ugly hack for length 0 axes @@ -2982,7 +2966,7 @@ def _is_empty_array(self, shape) -> bool: """Returns true if any axis is zero length.""" return any(x == 0 for x in shape) - def write_array(self, key: str, value, items=None): + def write_array(self, key, value, items=None): if key in self.group: self._handle.remove_node(self.group, key) @@ -3068,7 +3052,7 @@ def write_array(self, key: str, value, items=None): class LegacyFixed(GenericFixed): - def read_index_legacy(self, key: str, start=None, stop=None): + def read_index_legacy(self, key, start=None, stop=None): node = getattr(self.group, key) data = node[start:stop] kind = node._v_attrs.kind @@ -3241,9 +3225,6 @@ class Table(Fixed): is_table = True is_shape_reversed = False - data_columns: List[str] - selection: Optional["Selection"] - def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.index_axes = [] @@ -3256,7 +3237,7 @@ def __init__(self, *args, **kwargs): self.selection = None @property - def table_type_short(self) -> str: + def table_type_short(self): return self.table_type.split("_")[0] @property @@ -3330,7 +3311,7 @@ def validate(self, other): ) @property - def is_multi_index(self) -> bool: + def is_multi_index(self): """the levels attribute is 1 or a list in the case of a multi-index""" return isinstance(self.levels, list) @@ -3354,7 +3335,7 @@ def validate_multiindex(self, obj): ) @property - def nrows_expected(self) -> int: + def nrows_expected(self): """ based on our axes, compute the expected nrows """ return np.prod([i.cvalues.shape[0] for i in self.index_axes]) @@ -3411,7 +3392,7 @@ def queryables(self): [(a.cname, a) for a in self.index_axes] + [ (self.storage_obj_type._AXIS_NAMES[axis], None) - for axis, _ in self.non_index_axes + for axis, values in self.non_index_axes ] + [ (v.cname, v) @@ -3452,7 +3433,7 @@ def write_metadata(self, key, values): nan_rep=self.nan_rep, ) - def read_metadata(self, key: str): + def read_metadata(self, key): """ return the meta data array for this key """ if getattr(getattr(self.group, "meta", None), key, None) is not None: return self.parent.select(self._get_metadata_path(key)) @@ -3581,8 +3562,6 @@ def create_index(self, columns=None, optlevel=None, kind=None): columns = [a.cname for a in self.axes if a.is_data_indexable] if not isinstance(columns, (tuple, list)): columns = [columns] - # At this point we must have all-str columns, or else we will - # raise in getattr below. kw = dict() if optlevel is not None: @@ -4200,7 +4179,7 @@ def write( # add the rows self.write_data(chunksize, dropna=dropna) - def write_data(self, chunksize, dropna: bool = False): + def write_data(self, chunksize, dropna=False): """ we form the data into a 2-d including indexes,values,mask write chunk-by-chunk """ @@ -4552,7 +4531,6 @@ def indexables(self): self._indexables = [GenericIndexCol(name="index", axis=0)] for i, n in enumerate(d._v_names): - n: str # _v_names should all be strings dc = GenericDataIndexableCol( name=n, pos=i, values=[n], version=self.version @@ -4574,7 +4552,7 @@ class AppendableMultiFrameTable(AppendableFrameTable): _re_levels = re.compile(r"^level_\d+$") @property - def table_type_short(self) -> str: + def table_type_short(self): return "appendable_multi" def write(self, obj, data_columns=None, **kwargs): From 33ce65a7679320968a31df0d4f677107f13a7482 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 18 Nov 2019 08:25:26 -0800 Subject: [PATCH 09/15] types --- pandas/io/pytables.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 193b8f5053d65..7fef6ceb457d5 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -3052,7 +3052,7 @@ def write_array(self, key, value, items=None): class LegacyFixed(GenericFixed): - def read_index_legacy(self, key, start=None, stop=None): + def read_index_legacy(self, key: str, start=None, stop=None): node = getattr(self.group, key) data = node[start:stop] kind = node._v_attrs.kind @@ -3237,7 +3237,7 @@ def __init__(self, *args, **kwargs): self.selection = None @property - def table_type_short(self): + def table_type_short(self) -> str: return self.table_type.split("_")[0] @property @@ -3311,7 +3311,7 @@ def validate(self, other): ) @property - def is_multi_index(self): + def is_multi_index(self) -> bool: """the levels attribute is 1 or a list in the case of a multi-index""" return isinstance(self.levels, list) @@ -3335,7 +3335,7 @@ def validate_multiindex(self, obj): ) @property - def nrows_expected(self): + def nrows_expected(self) -> int: """ based on our axes, compute the expected nrows """ return np.prod([i.cvalues.shape[0] for i in self.index_axes]) @@ -3691,7 +3691,7 @@ def create_axes( self, axes, obj, - validate=True, + validate: bool = True, nan_rep=None, data_columns=None, min_itemsize=None, From 5fc534d632e71e6d49378d2cc16a1bfa9df29f51 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 18 Nov 2019 08:31:55 -0800 Subject: [PATCH 10/15] Types --- pandas/io/pytables.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 7fef6ceb457d5..5f0cbd3bce925 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -2836,7 +2836,7 @@ def write_block_index(self, key, index): self.write_array("{key}_blengths".format(key=key), index.blengths) setattr(self.attrs, "{key}_length".format(key=key), index.length) - def read_block_index(self, key, **kwargs): + def read_block_index(self, key, **kwargs) -> BlockIndex: length = getattr(self.attrs, "{key}_length".format(key=key)) blocs = self.read_array("{key}_blocs".format(key=key), **kwargs) blengths = self.read_array("{key}_blengths".format(key=key), **kwargs) @@ -2846,7 +2846,7 @@ def write_sparse_intindex(self, key, index): self.write_array("{key}_indices".format(key=key), index.indices) setattr(self.attrs, "{key}_length".format(key=key), index.length) - def read_sparse_intindex(self, key, **kwargs): + def read_sparse_intindex(self, key, **kwargs) -> IntIndex: length = getattr(self.attrs, "{key}_length".format(key=key)) indices = self.read_array("{key}_indices".format(key=key), **kwargs) return IntIndex(length, indices) @@ -2878,7 +2878,7 @@ def write_multi_index(self, key, index): label_key = "{key}_label{idx}".format(key=key, idx=i) self.write_array(label_key, level_codes) - def read_multi_index(self, key, **kwargs): + def read_multi_index(self, key, **kwargs) -> MultiIndex: nlevels = getattr(self.attrs, "{key}_nlevels".format(key=key)) levels = [] @@ -2953,7 +2953,7 @@ def read_index_node(self, node, start=None, stop=None): return name, index - def write_array_empty(self, key, value): + def write_array_empty(self, key: str, value): """ write a 0-len array """ # ugly hack for length 0 axes @@ -2966,7 +2966,7 @@ def _is_empty_array(self, shape) -> bool: """Returns true if any axis is zero length.""" return any(x == 0 for x in shape) - def write_array(self, key, value, items=None): + def write_array(self, key: str, value, items=None): if key in self.group: self._handle.remove_node(self.group, key) @@ -4913,7 +4913,7 @@ class Selection: """ - def __init__(self, table, where=None, start=None, stop=None): + def __init__(self, table: Table, where=None, start=None, stop=None): self.table = table self.where = where self.start = start From af7106c53565c39ef22bee8613c05ffce7659373 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 18 Nov 2019 08:34:22 -0800 Subject: [PATCH 11/15] types --- pandas/io/pytables.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 5f0cbd3bce925..48508c3241943 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -1871,7 +1871,7 @@ def validate(self, handler, append): def validate_names(self): pass - def validate_and_set(self, handler, append): + def validate_and_set(self, handler, append: bool): self.set_table(handler.table) self.validate_col() self.validate_attr(append) @@ -1901,7 +1901,7 @@ def validate_col(self, itemsize=None): return None - def validate_attr(self, append): + def validate_attr(self, append: bool): # check for backwards incompatibility if append: existing_kind = getattr(self.attrs, self.kind_attr, None) From 7aa30f93c229edf48c52747e07639ab0d31b5ee2 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 18 Nov 2019 08:38:52 -0800 Subject: [PATCH 12/15] types --- pandas/io/pytables.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 48508c3241943..60e7c31766cc3 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -943,13 +943,13 @@ def func(_start, _stop, _where): return it.get_result(coordinates=True) - def put(self, key, value, format=None, append=False, **kwargs): + def put(self, key: str, value, format=None, append=False, **kwargs): """ Store object in HDFStore. Parameters ---------- - key : object + key : str value : {Series, DataFrame} format : 'fixed(f)|table(t)', default is 'fixed' fixed(f) : Fixed format @@ -1028,7 +1028,14 @@ def remove(self, key: str, where=None, start=None, stop=None): return s.delete(where=where, start=start, stop=stop) def append( - self, key, value, format=None, append=True, columns=None, dropna=None, **kwargs + self, + key: str, + value, + format=None, + append=True, + columns=None, + dropna=None, + **kwargs, ): """ Append to Table in file. Node must already exist and be Table @@ -1036,7 +1043,7 @@ def append( Parameters ---------- - key : object + key : str value : {Series, DataFrame} format : 'table' is the default table(t) : table format @@ -1077,7 +1084,14 @@ def append( self._write_to_group(key, value, append=append, dropna=dropna, **kwargs) def append_to_multiple( - self, d, value, selector, data_columns=None, axes=None, dropna=False, **kwargs + self, + d: Dict, + value, + selector, + data_columns=None, + axes=None, + dropna=False, + **kwargs, ): """ Append to multiple tables @@ -1123,7 +1137,7 @@ def append_to_multiple( # figure out how to split the value remain_key = None - remain_values = [] + remain_values: List = [] for k, v in d.items(): if v is None: if remain_key is not None: From 025d34373df104775ddc4e4f909405ecaa075d53 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 18 Nov 2019 08:56:21 -0800 Subject: [PATCH 13/15] types --- pandas/io/pytables.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 60e7c31766cc3..f1b9247607172 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -520,16 +520,16 @@ def root(self): def filename(self): return self._path - def __getitem__(self, key): + def __getitem__(self, key: str): return self.get(key) - def __setitem__(self, key, value): + def __setitem__(self, key: str, value): self.put(key, value) - def __delitem__(self, key): + def __delitem__(self, key: str): return self.remove(key) - def __getattr__(self, name): + def __getattr__(self, name: str): """ allow attribute access to get stores """ try: return self.get(name) From 35a42c1887aaf154fb03f0a1008c08f08152a6be Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 18 Nov 2019 10:56:52 -0800 Subject: [PATCH 14/15] types --- pandas/io/pytables.py | 71 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index f1b9247607172..9b5fd0d01a9d7 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -791,7 +791,12 @@ def func(_start, _stop, _where): return it.get_result() def select_as_coordinates( - self, key: str, where=None, start=None, stop=None, **kwargs + self, + key: str, + where=None, + start: Optional[int] = None, + stop: Optional[int] = None, + **kwargs, ): """ return the selection as an Index @@ -2009,7 +2014,15 @@ class GenericIndexCol(IndexCol): def is_indexed(self) -> bool: return False - def convert(self, values, nan_rep, encoding, errors, start=None, stop=None): + def convert( + self, + values, + nan_rep, + encoding, + errors, + start: Optional[int] = None, + stop: Optional[int] = None, + ): """ set the values from this selection: take = take ownership Parameters @@ -2026,9 +2039,9 @@ def convert(self, values, nan_rep, encoding, errors, start=None, stop=None): the underlying table's row count are normalized to that. """ - start = start if start is not None else 0 - stop = min(stop, self.table.nrows) if stop is not None else self.table.nrows - self.values = Int64Index(np.arange(stop - start)) + _start = start if start is not None else 0 + _stop = min(stop, self.table.nrows) if stop is not None else self.table.nrows + self.values = Int64Index(np.arange(_stop - _start)) return self @@ -2763,7 +2776,9 @@ def get_attrs(self): def write(self, obj, **kwargs): self.set_attrs() - def read_array(self, key: str, start=None, stop=None): + def read_array( + self, key: str, start: Optional[int] = None, stop: Optional[int] = None + ): """ read an array for the specified node (off of group """ import tables @@ -2912,7 +2927,9 @@ def read_multi_index(self, key, **kwargs) -> MultiIndex: levels=levels, codes=codes, names=names, verify_integrity=True ) - def read_index_node(self, node, start=None, stop=None): + def read_index_node( + self, node, start: Optional[int] = None, stop: Optional[int] = None + ): data = node[start:stop] # If the index was an empty array write_array_empty() will # have written a sentinel. Here we relace it with the original. @@ -3066,7 +3083,9 @@ def write_array(self, key: str, value, items=None): class LegacyFixed(GenericFixed): - def read_index_legacy(self, key: str, start=None, stop=None): + def read_index_legacy( + self, key: str, start: Optional[int] = None, stop: Optional[int] = None + ): node = getattr(self.group, key) data = node[start:stop] kind = node._v_attrs.kind @@ -4014,7 +4033,13 @@ def create_description( return d - def read_coordinates(self, where=None, start=None, stop=None, **kwargs): + def read_coordinates( + self, + where=None, + start: Optional[int] = None, + stop: Optional[int] = None, + **kwargs, + ): """select coordinates (row numbers) from a table; return the coordinates object """ @@ -4027,7 +4052,7 @@ def read_coordinates(self, where=None, start=None, stop=None, **kwargs): return False # create the selection - self.selection = Selection(self, where=where, start=start, stop=stop, **kwargs) + self.selection = Selection(self, where=where, start=start, stop=stop) coords = self.selection.select_coords() if self.selection.filter is not None: for field, op, filt in self.selection.filter.format(): @@ -4038,7 +4063,13 @@ def read_coordinates(self, where=None, start=None, stop=None, **kwargs): return Index(coords) - def read_column(self, column: str, where=None, start=None, stop=None): + def read_column( + self, + column: str, + where=None, + start: Optional[int] = None, + stop: Optional[int] = None, + ): """return a single column from the table, generally only indexables are interesting """ @@ -4316,7 +4347,13 @@ def write_data_chunk(self, rows, indexes, mask, values): "tables cannot write this data -> {detail}".format(detail=detail) ) - def delete(self, where=None, start=None, stop=None, **kwargs): + def delete( + self, + where=None, + start: Optional[int] = None, + stop: Optional[int] = None, + **kwargs, + ): # delete all rows (and return the nrows) if where is None or not len(where): @@ -4337,7 +4374,7 @@ def delete(self, where=None, start=None, stop=None, **kwargs): # create the selection table = self.table - self.selection = Selection(self, where, start=start, stop=stop, **kwargs) + self.selection = Selection(self, where, start=start, stop=stop) values = self.selection.select_coords() # delete the rows in reverse order @@ -4927,7 +4964,13 @@ class Selection: """ - def __init__(self, table: Table, where=None, start=None, stop=None): + def __init__( + self, + table: Table, + where=None, + start: Optional[int] = None, + stop: Optional[int] = None, + ): self.table = table self.where = where self.start = start From 91cd8534f266c2118e5969648e4e47fce0e650de Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 18 Nov 2019 11:46:41 -0800 Subject: [PATCH 15/15] types --- pandas/io/pytables.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 9b5fd0d01a9d7..9589832095474 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -1890,7 +1890,7 @@ def validate(self, handler, append): def validate_names(self): pass - def validate_and_set(self, handler, append: bool): + def validate_and_set(self, handler: "AppendableTable", append: bool): self.set_table(handler.table) self.validate_col() self.validate_attr(append) @@ -1986,7 +1986,7 @@ def read_metadata(self, handler): """ retrieve the metadata for this columns """ self.metadata = handler.read_metadata(self.cname) - def validate_metadata(self, handler): + def validate_metadata(self, handler: "AppendableTable"): """ validate that kind=category does not change the categories """ if self.meta == "category": new_metadata = self.metadata @@ -2001,7 +2001,7 @@ def validate_metadata(self, handler): "different categories to the existing" ) - def write_metadata(self, handler): + def write_metadata(self, handler: "AppendableTable"): """ set the meta data """ if self.metadata is not None: handler.write_metadata(self.cname, self.metadata)