11from pathlib import Path
22from typing import Literal , Sequence
33
4- from typing_extensions import assert_never
5-
64from .config import PINS_ENV_INSECURE_READ , get_allow_pickle_read
75from .errors import PinsInsecureReadError
86from .meta import Meta
@@ -24,7 +22,8 @@ def _assert_is_pandas_df(x, file_type: str) -> None:
2422 )
2523
2624
27- def _get_df_family (df ) -> Literal ["unknown" , "pandas" , "polars" ]:
25+ def _get_df_family (df ) -> Literal ["pandas" , "polars" ]:
26+ """Return the type of DataFrame, or raise NotImplementedError if we can't decide."""
2827 try :
2928 import polars as pl
3029 except ModuleNotFoundError :
@@ -36,16 +35,15 @@ def _get_df_family(df) -> Literal["unknown", "pandas", "polars"]:
3635
3736 is_pandas_df = isinstance (df , pd .DataFrame )
3837
39- if not is_polars_df and not is_pandas_df :
40- return "unknown"
41- if is_polars_df and is_pandas_df : # Hybrid DataFrame type!
42- return "unknown"
38+ if is_polars_df and is_pandas_df :
39+ raise NotImplementedError (
40+ " Hybrid DataFrames (simultaneously pandas and polars) are not supported."
41+ )
4342 elif is_polars_df :
4443 return "polars"
4544 elif is_pandas_df :
4645 return "pandas"
47- else :
48- assert_never (df )
46+ raise NotImplementedError (f"Unrecognized DataFrame type: { type (df )} " )
4947
5048
5149def load_path (meta , path_to_version ):
@@ -234,15 +232,13 @@ def save_data(obj, fname, type=None, apply_suffix: bool = True) -> "str | Sequen
234232
235233
236234def default_title (obj , name ):
237- df_family = _get_df_family (obj )
238-
239- if df_family in ("pandas" , "polars" ):
240- # TODO(compat): title says CSV rather than data.frame
241- # see https://github.com/machow/pins-python/issues/5
242- shape_str = " x " .join (map (str , obj .shape ))
243- return f"{ name } : a pinned { shape_str } DataFrame"
244- elif df_family == "unknown" :
235+ try :
236+ _get_df_family (obj )
237+ except NotImplementedError :
245238 obj_name = type (obj ).__qualname__
246239 return f"{ name } : a pinned { obj_name } object"
247- else :
248- assert_never (df_family )
240+
241+ # TODO(compat): title says CSV rather than data.frame
242+ # see https://github.com/machow/pins-python/issues/5
243+ shape_str = " x " .join (map (str , obj .shape ))
244+ return f"{ name } : a pinned { shape_str } DataFrame"
0 commit comments