Skip to content

Commit 0680139

Browse files
committed
remove unnecessary exception catch and use dataclass
1 parent b4dcce7 commit 0680139

File tree

1 file changed

+18
-15
lines changed

1 file changed

+18
-15
lines changed

bigframes/display/anywidget.py

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414

1515
from __future__ import annotations
1616

17+
import dataclasses
1718
from importlib import resources
1819
import functools
1920
import math
20-
from typing import Any, Dict, Iterator, List, Optional, Tuple, Type
21+
from typing import Any, Dict, Iterator, List, Optional, Type
2122
import uuid
2223

2324
import pandas as pd
@@ -47,6 +48,12 @@
4748
WIDGET_BASE = object
4849

4950

51+
@dataclasses.dataclass(frozen=True)
52+
class _SortState:
53+
column: str
54+
ascending: bool
55+
56+
5057
class TableWidget(WIDGET_BASE):
5158
"""An interactive, paginated table widget for BigFrames DataFrames.
5259
@@ -91,17 +98,18 @@ def __init__(self, dataframe: bigframes.dataframe.DataFrame):
9198
self._all_data_loaded = False
9299
self._batch_iter: Optional[Iterator[pd.DataFrame]] = None
93100
self._cached_batches: List[pd.DataFrame] = []
94-
self._last_sort_state: Optional[Tuple[str, bool]] = None
101+
self._last_sort_state: Optional[_SortState] = None
95102

96103
# respect display options for initial page size
97104
initial_page_size = bigframes.options.display.max_rows
98105

99106
# set traitlets properties that trigger observers
107+
# TODO(b/462525985): Investigate and improve TableWidget UX for DataFrames with a large number of columns.
100108
self.page_size = initial_page_size
101109
self.orderable_columns = [
102-
col
103-
for col in dataframe.columns
104-
if dtypes.is_orderable(dataframe.dtypes[col])
110+
col_name
111+
for col_name, dtype in dataframe.dtypes.items()
112+
if dtypes.is_orderable(dtype)
105113
]
106114

107115
# obtain the row counts
@@ -248,22 +256,17 @@ def _set_table_html(self) -> None:
248256
# Apply sorting if a column is selected
249257
df_to_display = self._dataframe
250258
if self.sort_column:
251-
try:
252-
df_to_display = df_to_display.sort_values(
253-
by=self.sort_column, ascending=self.sort_ascending
254-
)
255-
except KeyError:
256-
self._error_message = f"Column '{self.sort_column}' not found. Please select a valid column to sort by."
257-
# Revert to unsorted state if sorting fails
258-
self.sort_column = ""
259+
df_to_display = df_to_display.sort_values(
260+
by=self.sort_column, ascending=self.sort_ascending
261+
)
259262

260263
# Reset batches when sorting changes
261-
if self._last_sort_state != (self.sort_column, self.sort_ascending):
264+
if self._last_sort_state != _SortState(self.sort_column, self.sort_ascending):
262265
self._batches = df_to_display._to_pandas_batches(page_size=self.page_size)
263266
self._cached_batches = []
264267
self._batch_iter = None
265268
self._all_data_loaded = False
266-
self._last_sort_state = (self.sort_column, self.sort_ascending)
269+
self._last_sort_state = _SortState(self.sort_column, self.sort_ascending)
267270
self.page = 0 # Reset to first page
268271

269272
start = self.page * self.page_size

0 commit comments

Comments
 (0)