  def __PrintTable(
      self, print_func: Callable[[str, int], None], filter_empty: bool) -> None:
    """Displays the table of information and warnings to the user.

    Args:
      print_func (Callable[[str, int], None]): A printing function, typically
          already with the required indent.
      filter_empty (bool): Filter for information/warning entries that have a
          non-empty value.
    """
    info, warnings = self._GetInformationAndWarnings(filter_empty=filter_empty)

    key_max_len = max(map(len, info.keys() | warnings.keys()), default=-1)
    if key_max_len == -1:
      # Nothing to display, info and warnings were both empty
      print_func('-', logging.INFO)
      return

    def MakeRow(item: Tuple[str, Any]) -> str:
      """Creates a row from a key-value pair.

      Args:
        item (Tuple[str, str]): The key-value pair.

      Returns:
        str: The created row.
      """
      return '{0:s} : {1!s}'.format(item[0].ljust(key_max_len), item[1])

    row_max_len = max(
        len(MakeRow(item))
        for item in list(info.items()) + list(warnings.items()))
    separator = '-' * row_max_len

    print_func(separator, logging.INFO)
    for info_item in info.items():
      print_func(MakeRow(info_item), logging.INFO)
    for warning_item in warnings.items():
      print_func(MakeRow(warning_item), logging.WARNING)
    print_func(separator, logging.INFO)
Displays the table of information and warnings to the user.

Args:
print_func (Callable[[str, int], None]): A printing function, typically
already with the required indent.
filter_empty (bool): Filter for information/warning entries that have a
non-empty value.
libcloudforensics/providers/kubernetes/enumerations/base.py