diff --git a/pandas/io/formats/format.py b/pandas/io/formats/format.py
index c4e3dd1c755cf..0e8ed7b25d665 100644
--- a/pandas/io/formats/format.py
+++ b/pandas/io/formats/format.py
@@ -400,7 +400,6 @@ def _get_adjustment():
class TableFormatter:
- is_truncated = False
show_dimensions = None
@property
diff --git a/pandas/io/formats/html.py b/pandas/io/formats/html.py
index e6aae44baa69b..c2f4ee2c4a68b 100644
--- a/pandas/io/formats/html.py
+++ b/pandas/io/formats/html.py
@@ -4,15 +4,20 @@
from collections import OrderedDict
from textwrap import dedent
+from typing import Dict, List, Optional, Tuple, Union
from pandas._config import get_option
-from pandas.core.dtypes.generic import ABCMultiIndex
+from pandas.core.dtypes.generic import ABCIndex, ABCMultiIndex
from pandas import option_context
from pandas.io.common import _is_url
-from pandas.io.formats.format import TableFormatter, get_level_lengths
+from pandas.io.formats.format import (
+ DataFrameFormatter,
+ TableFormatter,
+ get_level_lengths,
+)
from pandas.io.formats.printing import pprint_thing
@@ -28,13 +33,18 @@ class HTMLFormatter(TableFormatter):
indent_delta = 2
- def __init__(self, formatter, classes=None, border=None):
+ def __init__(
+ self,
+ formatter: DataFrameFormatter,
+ classes: Optional[Union[str, List, Tuple]] = None,
+ border: Optional[bool] = None,
+ ) -> None:
self.fmt = formatter
self.classes = classes
self.frame = self.fmt.frame
self.columns = self.fmt.tr_frame.columns
- self.elements = []
+ self.elements = [] # type: List[str]
self.bold_rows = self.fmt.kwds.get("bold_rows", False)
self.escape = self.fmt.kwds.get("escape", True)
self.show_dimensions = self.fmt.show_dimensions
@@ -47,15 +57,15 @@ def __init__(self, formatter, classes=None, border=None):
self.fmt.col_space = "{colspace}px".format(colspace=self.fmt.col_space)
@property
- def show_row_idx_names(self):
+ def show_row_idx_names(self) -> bool:
return self.fmt.show_row_idx_names
@property
- def show_col_idx_names(self):
+ def show_col_idx_names(self) -> bool:
return self.fmt.show_col_idx_names
@property
- def row_levels(self):
+ def row_levels(self) -> int:
if self.fmt.index:
# showing (row) index
return self.frame.index.nlevels
@@ -69,22 +79,24 @@ def row_levels(self):
# not showing (row) index
return 0
- def _get_columns_formatted_values(self):
+ def _get_columns_formatted_values(self) -> ABCIndex:
return self.columns
@property
- def is_truncated(self):
+ def is_truncated(self) -> bool:
return self.fmt.is_truncated
@property
- def ncols(self):
+ def ncols(self) -> int:
return len(self.fmt.tr_frame.columns)
- def write(self, s, indent=0):
+ def write(self, s: str, indent: int = 0) -> None:
rs = pprint_thing(s)
self.elements.append(" " * indent + rs)
- def write_th(self, s, header=False, indent=0, tags=None):
+ def write_th(
+ self, s: str, header: bool = False, indent: int = 0, tags: Optional[str] = None
+ ) -> None:
"""
Method for writting a formatted
cell.
@@ -111,12 +123,14 @@ def write_th(self, s, header=False, indent=0, tags=None):
tags = tags or ""
tags += 'style="min-width: {colspace};"'.format(colspace=self.fmt.col_space)
- return self._write_cell(s, kind="th", indent=indent, tags=tags)
+ self._write_cell(s, kind="th", indent=indent, tags=tags)
- def write_td(self, s, indent=0, tags=None):
- return self._write_cell(s, kind="td", indent=indent, tags=tags)
+ def write_td(self, s: str, indent: int = 0, tags: Optional[str] = None) -> None:
+ self._write_cell(s, kind="td", indent=indent, tags=tags)
- def _write_cell(self, s, kind="td", indent=0, tags=None):
+ def _write_cell(
+ self, s: str, kind: str = "td", indent: int = 0, tags: Optional[str] = None
+ ) -> None:
if tags is not None:
start_tag = "<{kind} {tags}>".format(kind=kind, tags=tags)
else:
@@ -124,7 +138,9 @@ def _write_cell(self, s, kind="td", indent=0, tags=None):
if self.escape:
# escape & first to prevent double escaping of &
- esc = OrderedDict([("&", r"&"), ("<", r"<"), (">", r">")])
+ esc = OrderedDict(
+ [("&", r"&"), ("<", r"<"), (">", r">")]
+ ) # type: Union[OrderedDict[str, str], Dict]
else:
esc = {}
@@ -146,14 +162,14 @@ def _write_cell(self, s, kind="td", indent=0, tags=None):
def write_tr(
self,
- line,
- indent=0,
- indent_delta=0,
- header=False,
- align=None,
- tags=None,
- nindex_levels=0,
- ):
+ line: List[str],
+ indent: int = 0,
+ indent_delta: int = 0,
+ header: bool = False,
+ align: Optional[str] = None,
+ tags: Optional[Dict[int, str]] = None,
+ nindex_levels: int = 0,
+ ) -> None:
if tags is None:
tags = {}
@@ -173,7 +189,7 @@ def write_tr(
indent -= indent_delta
self.write("", indent)
- def render(self):
+ def render(self) -> List[str]:
self._write_table()
if self.should_show_dimensions:
@@ -186,7 +202,7 @@ def render(self):
return self.elements
- def _write_table(self, indent=0):
+ def _write_table(self, indent: int = 0) -> None:
_classes = ["dataframe"] # Default class.
use_mathjax = get_option("display.html.use_mathjax")
if not use_mathjax:
@@ -220,7 +236,7 @@ def _write_table(self, indent=0):
self.write("", indent)
- def _write_col_header(self, indent):
+ def _write_col_header(self, indent: int) -> None:
truncate_h = self.fmt.truncate_h
if isinstance(self.columns, ABCMultiIndex):
template = 'colspan="{span:d}" halign="left"'
@@ -337,14 +353,14 @@ def _write_col_header(self, indent):
self.write_tr(row, indent, self.indent_delta, header=True, align=align)
- def _write_row_header(self, indent):
+ def _write_row_header(self, indent: int) -> None:
truncate_h = self.fmt.truncate_h
row = [x if x is not None else "" for x in self.frame.index.names] + [""] * (
self.ncols + (1 if truncate_h else 0)
)
self.write_tr(row, indent, self.indent_delta, header=True)
- def _write_header(self, indent):
+ def _write_header(self, indent: int) -> None:
self.write("", indent)
if self.fmt.header:
@@ -355,12 +371,12 @@ def _write_header(self, indent):
self.write("", indent)
- def _get_formatted_values(self):
+ def _get_formatted_values(self) -> Dict[int, List[str]]:
with option_context("display.max_colwidth", 999999):
fmt_values = {i: self.fmt._format_col(i) for i in range(self.ncols)}
return fmt_values
- def _write_body(self, indent):
+ def _write_body(self, indent: int) -> None:
self.write(" | ", indent)
fmt_values = self._get_formatted_values()
@@ -372,7 +388,9 @@ def _write_body(self, indent):
self.write("", indent)
- def _write_regular_rows(self, fmt_values, indent):
+ def _write_regular_rows(
+ self, fmt_values: Dict[int, List[str]], indent: int
+ ) -> None:
truncate_h = self.fmt.truncate_h
truncate_v = self.fmt.truncate_v
@@ -385,7 +403,7 @@ def _write_regular_rows(self, fmt_values, indent):
else:
index_values = self.fmt.tr_frame.index.format()
- row = []
+ row = [] # type: List[str]
for i in range(nrows):
if truncate_v and i == (self.fmt.tr_row_num):
@@ -416,7 +434,9 @@ def _write_regular_rows(self, fmt_values, indent):
row, indent, self.indent_delta, tags=None, nindex_levels=self.row_levels
)
- def _write_hierarchical_rows(self, fmt_values, indent):
+ def _write_hierarchical_rows(
+ self, fmt_values: Dict[int, List[str]], indent: int
+ ) -> None:
template = 'rowspan="{span}" valign="top"'
truncate_h = self.fmt.truncate_h
@@ -546,13 +566,13 @@ class NotebookFormatter(HTMLFormatter):
DataFrame._repr_html_() and DataFrame.to_html(notebook=True)
"""
- def _get_formatted_values(self):
+ def _get_formatted_values(self) -> Dict[int, List[str]]:
return {i: self.fmt._format_col(i) for i in range(self.ncols)}
- def _get_columns_formatted_values(self):
+ def _get_columns_formatted_values(self) -> List[str]:
return self.columns.format()
- def write_style(self):
+ def write_style(self) -> None:
# We use the "scoped" attribute here so that the desired
# style properties for the data frame are not then applied
# throughout the entire notebook.
@@ -580,7 +600,7 @@ def write_style(self):
template = dedent("\n".join((template_first, template_mid, template_last)))
self.write(template)
- def render(self):
+ def render(self) -> List[str]:
self.write("")
self.write_style()
super().render()