@@ -565,6 +565,7 @@ def __fspath__(self):
565565 def root (self ):
566566 """ return the root node """
567567 self ._check_if_open ()
568+ assert self ._handle is not None # for mypy
568569 return self ._handle .root
569570
570571 @property
@@ -1393,6 +1394,8 @@ def groups(self):
13931394 """
13941395 _tables ()
13951396 self ._check_if_open ()
1397+ assert self ._handle is not None # for mypy
1398+ assert _table_mod is not None # for mypy
13961399 return [
13971400 g
13981401 for g in self ._handle .walk_groups ()
@@ -1437,6 +1440,9 @@ def walk(self, where="/"):
14371440 """
14381441 _tables ()
14391442 self ._check_if_open ()
1443+ assert self ._handle is not None # for mypy
1444+ assert _table_mod is not None # for mypy
1445+
14401446 for g in self ._handle .walk_groups (where ):
14411447 if getattr (g ._v_attrs , "pandas_type" , None ) is not None :
14421448 continue
@@ -1862,6 +1868,8 @@ def __init__(
18621868 def __iter__ (self ):
18631869 # iterate
18641870 current = self .start
1871+ if self .coordinates is None :
1872+ raise ValueError ("Cannot iterate until get_result is called." )
18651873 while current < self .stop :
18661874 stop = min (current + self .chunksize , self .stop )
18671875 value = self .func (None , None , self .coordinates [current :stop ])
@@ -3196,7 +3204,7 @@ class Table(Fixed):
31963204 pandas_kind = "wide_table"
31973205 format_type : str = "table" # GH#30962 needed by dask
31983206 table_type : str
3199- levels = 1
3207+ levels : Union [ int , List [ Label ]] = 1
32003208 is_table = True
32013209
32023210 index_axes : List [IndexCol ]
@@ -3292,7 +3300,9 @@ def is_multi_index(self) -> bool:
32923300 """the levels attribute is 1 or a list in the case of a multi-index"""
32933301 return isinstance (self .levels , list )
32943302
3295- def validate_multiindex (self , obj ):
3303+ def validate_multiindex (
3304+ self , obj : FrameOrSeriesUnion
3305+ ) -> Tuple [DataFrame , List [Label ]]:
32963306 """
32973307 validate that we can store the multi-index; reset and return the
32983308 new object
@@ -3301,11 +3311,13 @@ def validate_multiindex(self, obj):
33013311 l if l is not None else f"level_{ i } " for i , l in enumerate (obj .index .names )
33023312 ]
33033313 try :
3304- return obj .reset_index (), levels
3314+ reset_obj = obj .reset_index ()
33053315 except ValueError as err :
33063316 raise ValueError (
33073317 "duplicate names/columns in the multi-index when storing as a table"
33083318 ) from err
3319+ assert isinstance (reset_obj , DataFrame ) # for mypy
3320+ return reset_obj , levels
33093321
33103322 @property
33113323 def nrows_expected (self ) -> int :
@@ -3433,7 +3445,7 @@ def get_attrs(self):
34333445 self .nan_rep = getattr (self .attrs , "nan_rep" , None )
34343446 self .encoding = _ensure_encoding (getattr (self .attrs , "encoding" , None ))
34353447 self .errors = _ensure_decoded (getattr (self .attrs , "errors" , "strict" ))
3436- self .levels = getattr (self .attrs , "levels" , None ) or []
3448+ self .levels : List [ Label ] = getattr (self .attrs , "levels" , None ) or []
34373449 self .index_axes = [a for a in self .indexables if a .is_an_indexable ]
34383450 self .values_axes = [a for a in self .indexables if not a .is_an_indexable ]
34393451
@@ -4562,11 +4574,12 @@ class AppendableMultiSeriesTable(AppendableSeriesTable):
45624574 def write (self , obj , ** kwargs ):
45634575 """ we are going to write this as a frame table """
45644576 name = obj .name or "values"
4565- obj , self .levels = self .validate_multiindex (obj )
4577+ newobj , self .levels = self .validate_multiindex (obj )
4578+ assert isinstance (self .levels , list ) # for mypy
45664579 cols = list (self .levels )
45674580 cols .append (name )
4568- obj .columns = cols
4569- return super ().write (obj = obj , ** kwargs )
4581+ newobj .columns = Index ( cols )
4582+ return super ().write (obj = newobj , ** kwargs )
45704583
45714584
45724585class GenericTable (AppendableFrameTable ):
@@ -4576,6 +4589,7 @@ class GenericTable(AppendableFrameTable):
45764589 table_type = "generic_table"
45774590 ndim = 2
45784591 obj_type = DataFrame
4592+ levels : List [Label ]
45794593
45804594 @property
45814595 def pandas_type (self ) -> str :
@@ -4609,7 +4623,7 @@ def indexables(self):
46094623 name = "index" , axis = 0 , table = self .table , meta = meta , metadata = md
46104624 )
46114625
4612- _indexables = [index_col ]
4626+ _indexables : List [ Union [ GenericIndexCol , GenericDataIndexableCol ]] = [index_col ]
46134627
46144628 for i , n in enumerate (d ._v_names ):
46154629 assert isinstance (n , str )
@@ -4652,6 +4666,7 @@ def write(self, obj, data_columns=None, **kwargs):
46524666 elif data_columns is True :
46534667 data_columns = obj .columns .tolist ()
46544668 obj , self .levels = self .validate_multiindex (obj )
4669+ assert isinstance (self .levels , list ) # for mypy
46554670 for n in self .levels :
46564671 if n not in data_columns :
46574672 data_columns .insert (0 , n )
@@ -5173,7 +5188,7 @@ def select_coords(self):
51735188 start = 0
51745189 elif start < 0 :
51755190 start += nrows
5176- if self . stop is None :
5191+ if stop is None :
51775192 stop = nrows
51785193 elif stop < 0 :
51795194 stop += nrows
0 commit comments