Skip to content

Commit 0729083

Browse files
committed
added returned type to FileHandler methods (issue #864)
1 parent f9be896 commit 0729083

File tree

6 files changed

+39
-22
lines changed

6 files changed

+39
-22
lines changed

larray/inout/common.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
from datetime import date, time, datetime
33
from collections import OrderedDict
44

5+
from typing import List, Tuple
6+
57
from larray.core.axis import Axis
68
from larray.core.group import Group
79
from larray.core.array import Array
10+
from larray.core.metadata import Metadata
811

912

1013
# all formats
@@ -17,7 +20,7 @@
1720
_supported_typenames = {cls.__name__ for cls in _supported_types}
1821

1922

20-
def _get_index_col(nb_axes=None, index_col=None, wide=True):
23+
def _get_index_col(nb_axes=None, index_col=None, wide=True) -> List[int]:
2124
if not wide:
2225
if nb_axes is not None or index_col is not None:
2326
raise ValueError("`nb_axes` or `index_col` argument cannot be used when `wide` argument is False")
@@ -57,7 +60,8 @@ def _open_for_read(self):
5760
def _open_for_write(self):
5861
raise NotImplementedError()
5962

60-
def list_items(self):
63+
# FIXME : return an ordinary dict instead (Python < 3.6 no longer supported)
64+
def list_items(self) -> List[Tuple[str, str]]:
6165
r"""
6266
Return list containing pairs (name, type) for all stored objects
6367
"""
@@ -67,7 +71,7 @@ def _read_item(self, key, type, *args, **kwargs):
6771
r"""Read item"""
6872
raise NotImplementedError()
6973

70-
def _read_metadata(self):
74+
def _read_metadata(self) -> Metadata:
7175
r"""Read metadata"""
7276
raise NotImplementedError()
7377

@@ -102,7 +106,8 @@ def _update_original_file(self):
102106
os.remove(self.original_file_name)
103107
os.rename(self.fname, self.original_file_name)
104108

105-
def read(self, keys, *args, **kwargs):
109+
# FIXME : replace OrderedDict by ordinary dict (Python < 3.6 no longer supported)
110+
def read(self, keys, *args, **kwargs) -> Tuple[Metadata, OrderedDict]:
106111
r"""
107112
Reads file content (HDF, Excel, CSV, ...) and returns a dictionary containing loaded objects.
108113

larray/inout/csv.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import pandas as pd
77
import numpy as np
88

9+
from typing import List, Tuple
10+
911
from larray.core.array import Array, asarray
1012
from larray.core.constants import nan
1113
from larray.core.metadata import Metadata
@@ -273,7 +275,7 @@ def __init__(self, fname, overwrite_file=False, sep=','):
273275
def _get_original_file_name(self):
274276
pass
275277

276-
def _to_filepath(self, key):
278+
def _to_filepath(self, key: str) -> str:
277279
if self.directory is not None:
278280
return os.path.join(self.directory, f'{key}.csv')
279281
else:
@@ -291,7 +293,7 @@ def _open_for_write(self):
291293
if not os.path.isdir(self.directory):
292294
raise ValueError(f"Path {self.directory} must represent a directory")
293295

294-
def list_items(self):
296+
def list_items(self) -> List[Tuple[str, str]]:
295297
fnames = glob(self.pattern) if self.pattern is not None else []
296298
# drop directory
297299
fnames = [os.path.basename(fname) for fname in fnames]
@@ -300,7 +302,7 @@ def list_items(self):
300302
fnames = sorted([os.path.splitext(fname)[0] for fname in fnames])
301303
return [(name, 'Array') for name in fnames if name != '__metadata__']
302304

303-
def _read_item(self, key, type, *args, **kwargs):
305+
def _read_item(self, key, type, *args, **kwargs) -> Array:
304306
if type == 'Array':
305307
return read_csv(self._to_filepath(key), *args, **kwargs)
306308
else:
@@ -312,7 +314,7 @@ def _dump_item(self, key, value, *args, **kwargs):
312314
else:
313315
raise TypeError()
314316

315-
def _read_metadata(self):
317+
def _read_metadata(self) -> Metadata:
316318
filepath = self._to_filepath('__metadata__')
317319
if os.path.isfile(filepath):
318320
meta = read_csv(filepath, wide=False)

larray/inout/excel.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
except ImportError:
1313
xlsxwriter = None
1414

15+
from typing import List, Tuple
16+
1517
from larray.core.array import Array, asarray
1618
from larray.core.constants import nan
1719
from larray.core.group import _translate_sheet_name
@@ -243,10 +245,10 @@ def _open_for_write(self):
243245
engine = 'xlsxwriter' if ext == '.xlsx' and xlsxwriter is not None else None
244246
self.handle = pd.ExcelWriter(self.fname, engine=engine)
245247

246-
def list_items(self):
248+
def list_items(self) -> List[Tuple[str, str]]:
247249
return [(name, 'Array') for name in self.handle.sheet_names if name != '__metadata__']
248250

249-
def _read_item(self, key, type, *args, **kwargs):
251+
def _read_item(self, key, type, *args, **kwargs) -> Array:
250252
if type == 'Array':
251253
df = self.handle.parse(key, *args, **kwargs)
252254
return df_asarray(df, raw=True)
@@ -260,7 +262,7 @@ def _dump_item(self, key, value, *args, **kwargs):
260262
else:
261263
raise TypeError()
262264

263-
def _read_metadata(self):
265+
def _read_metadata(self) -> Metadata:
264266
sheet_meta = '__metadata__'
265267
if sheet_meta in self.handle.sheet_names:
266268
meta = read_excel(self.handle, sheet_meta, engine=self.handle.engine, wide=False)
@@ -298,10 +300,10 @@ def _open_for_read(self):
298300
def _open_for_write(self):
299301
self.handle = open_excel(self.fname, overwrite_file=self.overwrite_file)
300302

301-
def list_items(self):
303+
def list_items(self) -> List[Tuple[str, str]]:
302304
return [(name, 'Array') for name in self.handle.sheet_names() if name != '__metadata__']
303305

304-
def _read_item(self, key, type, *args, **kwargs):
306+
def _read_item(self, key, type, *args, **kwargs) -> Array:
305307
if type == 'Array':
306308
return self.handle[key].load(*args, **kwargs)
307309
else:
@@ -313,7 +315,7 @@ def _dump_item(self, key, value, *args, **kwargs):
313315
else:
314316
raise TypeError()
315317

316-
def _read_metadata(self):
318+
def _read_metadata(self) -> Metadata:
317319
sheet_meta = '__metadata__'
318320
if sheet_meta in self.handle:
319321
meta = self.handle[sheet_meta].load(wide=False)

larray/inout/hdf.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
import pandas as pd
55
from pandas import HDFStore
66

7+
from typing import List, Tuple, Union
8+
79
from larray.core.array import Array
810
from larray.core.axis import Axis
911
from larray.core.constants import nan
1012
from larray.core.group import Group, LGroup, _translate_group_key_hdf
1113
from larray.core.metadata import Metadata
1214
from larray.util.misc import LHDFStore
15+
from larray.util.types import Scalar
1316
from larray.inout.session import register_file_handler
1417
from larray.inout.common import FileHandler, _supported_typenames, _supported_scalars_types
1518
from larray.inout.pandas import df_asarray
@@ -136,7 +139,7 @@ def _open_for_read(self):
136139
def _open_for_write(self):
137140
self.handle = HDFStore(self.fname)
138141

139-
def list_items(self):
142+
def list_items(self) -> List[Tuple[str, str]]:
140143
keys = [key.strip('/') for key in self.handle.keys()]
141144
items = [(key, _get_type_from_attrs(self.handle.get_storer(key).attrs)) for key in keys if '/' not in key]
142145
# ---- for backward compatibility (LArray < 0.33) ----
@@ -146,7 +149,7 @@ def list_items(self):
146149
items += [(key.split('/')[-1], 'Group_Backward_Comp') for key in keys if '__groups__' in key]
147150
return items
148151

149-
def _read_item(self, key, typename, *args, **kwargs):
152+
def _read_item(self, key, typename, *args, **kwargs) -> Union[Array, Axis, Group, Scalar]:
150153
if typename in _supported_typenames:
151154
hdf_key = '/' + key
152155
# ---- for backward compatibility (LArray < 0.33) ----
@@ -172,7 +175,7 @@ def _dump_item(self, key, value, *args, **kwargs):
172175
else:
173176
raise TypeError()
174177

175-
def _read_metadata(self):
178+
def _read_metadata(self) -> Metadata:
176179
metadata = Metadata.from_hdf(self.handle)
177180
if metadata is None:
178181
metadata = Metadata()

larray/inout/pickle.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22
import os.path
33
from collections import OrderedDict
44

5+
from typing import List, Tuple, Union
6+
57
from larray.core.axis import Axis
68
from larray.core.group import Group
79
from larray.core.array import Array
810
from larray.core.metadata import Metadata
911
from larray.inout.session import register_file_handler
1012
from larray.inout.common import FileHandler, _supported_types, _supported_typenames, _supported_scalars_types
13+
from larray.util.types import Scalar
1114

1215

1316
@register_file_handler('pickle', ['pkl', 'pickle'])
@@ -22,7 +25,7 @@ def _open_for_write(self):
2225
else:
2326
self.data = OrderedDict()
2427

25-
def list_items(self):
28+
def list_items(self) -> List[Tuple[str, str]]:
2629
# scalar
2730
items = [(key, type(value).__name__) for key, value in self.data.items()
2831
if isinstance(value, _supported_scalars_types)]
@@ -34,7 +37,7 @@ def list_items(self):
3437
items += [(key, 'Array') for key, value in self.data.items() if isinstance(value, Array)]
3538
return items
3639

37-
def _read_item(self, key, typename, *args, **kwargs):
40+
def _read_item(self, key, typename, *args, **kwargs) -> Union[Array, Axis, Group, Scalar]:
3841
if typename in _supported_typenames:
3942
return self.data[key]
4043
else:
@@ -46,7 +49,7 @@ def _dump_item(self, key, value, *args, **kwargs):
4649
else:
4750
raise TypeError()
4851

49-
def _read_metadata(self):
52+
def _read_metadata(self) -> Metadata:
5053
if '__metadata__' in self.data:
5154
return self.data['__metadata__']
5255
else:

larray/inout/session.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from larray.inout.common import FileHandler
2+
13

24
handler_classes = {}
35
ext_default_engine = {}
@@ -13,7 +15,7 @@ def register_file_handler(engine, extensions=None):
1315
extensions : str or list of str, optional
1416
Extension(s) associated with the file handler.
1517
"""
16-
def decorate_class(cls):
18+
def decorate_class(cls: FileHandler) -> FileHandler:
1719
if engine not in handler_classes:
1820
handler_classes[engine] = cls
1921
if extensions is None:
@@ -28,7 +30,7 @@ def decorate_class(cls):
2830
return decorate_class
2931

3032

31-
def get_file_handler(engine):
33+
def get_file_handler(engine) -> FileHandler:
3234
if engine not in handler_classes:
3335
raise TypeError(f"Engine {engine} is currently not implemented")
3436
file_handler_cls = handler_classes[engine]

0 commit comments

Comments
 (0)