4
4
5
5
from collections import OrderedDict
6
6
from textwrap import dedent
7
+ from typing import Dict , List , Optional , Tuple , Union
7
8
8
9
from pandas ._config import get_option
9
10
10
- from pandas .core .dtypes .generic import ABCMultiIndex
11
+ from pandas .core .dtypes .generic import ABCIndex , ABCMultiIndex
11
12
12
13
from pandas import option_context
13
14
14
15
from pandas .io .common import _is_url
15
- from pandas .io .formats .format import TableFormatter , get_level_lengths
16
+ from pandas .io .formats .format import (
17
+ DataFrameFormatter ,
18
+ TableFormatter ,
19
+ get_level_lengths ,
20
+ )
16
21
from pandas .io .formats .printing import pprint_thing
17
22
18
23
@@ -28,13 +33,18 @@ class HTMLFormatter(TableFormatter):
28
33
29
34
indent_delta = 2
30
35
31
- def __init__ (self , formatter , classes = None , border = None ):
36
+ def __init__ (
37
+ self ,
38
+ formatter : DataFrameFormatter ,
39
+ classes : Optional [Union [str , List , Tuple ]] = None ,
40
+ border : Optional [bool ] = None ,
41
+ ) -> None :
32
42
self .fmt = formatter
33
43
self .classes = classes
34
44
35
45
self .frame = self .fmt .frame
36
46
self .columns = self .fmt .tr_frame .columns
37
- self .elements = []
47
+ self .elements = [] # type: List[str]
38
48
self .bold_rows = self .fmt .kwds .get ("bold_rows" , False )
39
49
self .escape = self .fmt .kwds .get ("escape" , True )
40
50
self .show_dimensions = self .fmt .show_dimensions
@@ -47,15 +57,15 @@ def __init__(self, formatter, classes=None, border=None):
47
57
self .fmt .col_space = "{colspace}px" .format (colspace = self .fmt .col_space )
48
58
49
59
@property
50
- def show_row_idx_names (self ):
60
+ def show_row_idx_names (self ) -> bool :
51
61
return self .fmt .show_row_idx_names
52
62
53
63
@property
54
- def show_col_idx_names (self ):
64
+ def show_col_idx_names (self ) -> bool :
55
65
return self .fmt .show_col_idx_names
56
66
57
67
@property
58
- def row_levels (self ):
68
+ def row_levels (self ) -> int :
59
69
if self .fmt .index :
60
70
# showing (row) index
61
71
return self .frame .index .nlevels
@@ -69,22 +79,24 @@ def row_levels(self):
69
79
# not showing (row) index
70
80
return 0
71
81
72
- def _get_columns_formatted_values (self ):
82
+ def _get_columns_formatted_values (self ) -> ABCIndex :
73
83
return self .columns
74
84
75
85
@property
76
- def is_truncated (self ):
86
+ def is_truncated (self ) -> bool :
77
87
return self .fmt .is_truncated
78
88
79
89
@property
80
- def ncols (self ):
90
+ def ncols (self ) -> int :
81
91
return len (self .fmt .tr_frame .columns )
82
92
83
- def write (self , s , indent = 0 ) :
93
+ def write (self , s : str , indent : int = 0 ) -> None :
84
94
rs = pprint_thing (s )
85
95
self .elements .append (" " * indent + rs )
86
96
87
- def write_th (self , s , header = False , indent = 0 , tags = None ):
97
+ def write_th (
98
+ self , s : str , header : bool = False , indent : int = 0 , tags : Optional [str ] = None
99
+ ) -> None :
88
100
"""
89
101
Method for writting a formatted <th> cell.
90
102
@@ -111,20 +123,24 @@ def write_th(self, s, header=False, indent=0, tags=None):
111
123
tags = tags or ""
112
124
tags += 'style="min-width: {colspace};"' .format (colspace = self .fmt .col_space )
113
125
114
- return self ._write_cell (s , kind = "th" , indent = indent , tags = tags )
126
+ self ._write_cell (s , kind = "th" , indent = indent , tags = tags )
115
127
116
- def write_td (self , s , indent = 0 , tags = None ):
117
- return self ._write_cell (s , kind = "td" , indent = indent , tags = tags )
128
+ def write_td (self , s : str , indent : int = 0 , tags : Optional [ str ] = None ) -> None :
129
+ self ._write_cell (s , kind = "td" , indent = indent , tags = tags )
118
130
119
- def _write_cell (self , s , kind = "td" , indent = 0 , tags = None ):
131
+ def _write_cell (
132
+ self , s : str , kind : str = "td" , indent : int = 0 , tags : Optional [str ] = None
133
+ ) -> None :
120
134
if tags is not None :
121
135
start_tag = "<{kind} {tags}>" .format (kind = kind , tags = tags )
122
136
else :
123
137
start_tag = "<{kind}>" .format (kind = kind )
124
138
125
139
if self .escape :
126
140
# escape & first to prevent double escaping of &
127
- esc = OrderedDict ([("&" , r"&" ), ("<" , r"<" ), (">" , r">" )])
141
+ esc = OrderedDict (
142
+ [("&" , r"&" ), ("<" , r"<" ), (">" , r">" )]
143
+ ) # type: Union[OrderedDict[str, str], Dict]
128
144
else :
129
145
esc = {}
130
146
@@ -146,14 +162,14 @@ def _write_cell(self, s, kind="td", indent=0, tags=None):
146
162
147
163
def write_tr (
148
164
self ,
149
- line ,
150
- indent = 0 ,
151
- indent_delta = 0 ,
152
- header = False ,
153
- align = None ,
154
- tags = None ,
155
- nindex_levels = 0 ,
156
- ):
165
+ line : List [ str ] ,
166
+ indent : int = 0 ,
167
+ indent_delta : int = 0 ,
168
+ header : bool = False ,
169
+ align : Optional [ str ] = None ,
170
+ tags : Optional [ Dict [ int , str ]] = None ,
171
+ nindex_levels : int = 0 ,
172
+ ) -> None :
157
173
if tags is None :
158
174
tags = {}
159
175
@@ -173,7 +189,7 @@ def write_tr(
173
189
indent -= indent_delta
174
190
self .write ("</tr>" , indent )
175
191
176
- def render (self ):
192
+ def render (self ) -> List [ str ] :
177
193
self ._write_table ()
178
194
179
195
if self .should_show_dimensions :
@@ -186,7 +202,7 @@ def render(self):
186
202
187
203
return self .elements
188
204
189
- def _write_table (self , indent = 0 ) :
205
+ def _write_table (self , indent : int = 0 ) -> None :
190
206
_classes = ["dataframe" ] # Default class.
191
207
use_mathjax = get_option ("display.html.use_mathjax" )
192
208
if not use_mathjax :
@@ -220,7 +236,7 @@ def _write_table(self, indent=0):
220
236
221
237
self .write ("</table>" , indent )
222
238
223
- def _write_col_header (self , indent ) :
239
+ def _write_col_header (self , indent : int ) -> None :
224
240
truncate_h = self .fmt .truncate_h
225
241
if isinstance (self .columns , ABCMultiIndex ):
226
242
template = 'colspan="{span:d}" halign="left"'
@@ -337,14 +353,14 @@ def _write_col_header(self, indent):
337
353
338
354
self .write_tr (row , indent , self .indent_delta , header = True , align = align )
339
355
340
- def _write_row_header (self , indent ) :
356
+ def _write_row_header (self , indent : int ) -> None :
341
357
truncate_h = self .fmt .truncate_h
342
358
row = [x if x is not None else "" for x in self .frame .index .names ] + ["" ] * (
343
359
self .ncols + (1 if truncate_h else 0 )
344
360
)
345
361
self .write_tr (row , indent , self .indent_delta , header = True )
346
362
347
- def _write_header (self , indent ) :
363
+ def _write_header (self , indent : int ) -> None :
348
364
self .write ("<thead>" , indent )
349
365
350
366
if self .fmt .header :
@@ -355,12 +371,12 @@ def _write_header(self, indent):
355
371
356
372
self .write ("</thead>" , indent )
357
373
358
- def _get_formatted_values (self ):
374
+ def _get_formatted_values (self ) -> Dict [ int , List [ str ]] :
359
375
with option_context ("display.max_colwidth" , 999999 ):
360
376
fmt_values = {i : self .fmt ._format_col (i ) for i in range (self .ncols )}
361
377
return fmt_values
362
378
363
- def _write_body (self , indent ) :
379
+ def _write_body (self , indent : int ) -> None :
364
380
self .write ("<tbody>" , indent )
365
381
fmt_values = self ._get_formatted_values ()
366
382
@@ -372,7 +388,9 @@ def _write_body(self, indent):
372
388
373
389
self .write ("</tbody>" , indent )
374
390
375
- def _write_regular_rows (self , fmt_values , indent ):
391
+ def _write_regular_rows (
392
+ self , fmt_values : Dict [int , List [str ]], indent : int
393
+ ) -> None :
376
394
truncate_h = self .fmt .truncate_h
377
395
truncate_v = self .fmt .truncate_v
378
396
@@ -385,7 +403,7 @@ def _write_regular_rows(self, fmt_values, indent):
385
403
else :
386
404
index_values = self .fmt .tr_frame .index .format ()
387
405
388
- row = []
406
+ row = [] # type: List[str]
389
407
for i in range (nrows ):
390
408
391
409
if truncate_v and i == (self .fmt .tr_row_num ):
@@ -416,7 +434,9 @@ def _write_regular_rows(self, fmt_values, indent):
416
434
row , indent , self .indent_delta , tags = None , nindex_levels = self .row_levels
417
435
)
418
436
419
- def _write_hierarchical_rows (self , fmt_values , indent ):
437
+ def _write_hierarchical_rows (
438
+ self , fmt_values : Dict [int , List [str ]], indent : int
439
+ ) -> None :
420
440
template = 'rowspan="{span}" valign="top"'
421
441
422
442
truncate_h = self .fmt .truncate_h
@@ -546,13 +566,13 @@ class NotebookFormatter(HTMLFormatter):
546
566
DataFrame._repr_html_() and DataFrame.to_html(notebook=True)
547
567
"""
548
568
549
- def _get_formatted_values (self ):
569
+ def _get_formatted_values (self ) -> Dict [ int , List [ str ]] :
550
570
return {i : self .fmt ._format_col (i ) for i in range (self .ncols )}
551
571
552
- def _get_columns_formatted_values (self ):
572
+ def _get_columns_formatted_values (self ) -> List [ str ] :
553
573
return self .columns .format ()
554
574
555
- def write_style (self ):
575
+ def write_style (self ) -> None :
556
576
# We use the "scoped" attribute here so that the desired
557
577
# style properties for the data frame are not then applied
558
578
# throughout the entire notebook.
@@ -580,7 +600,7 @@ def write_style(self):
580
600
template = dedent ("\n " .join ((template_first , template_mid , template_last )))
581
601
self .write (template )
582
602
583
- def render (self ):
603
+ def render (self ) -> List [ str ] :
584
604
self .write ("<div>" )
585
605
self .write_style ()
586
606
super ().render ()
0 commit comments