improve typing
after we have the new DictOfSeries
etc we should improve typing. @schaefed any thoughts?
We can make typehints from typing.TypeVar
and real ABC-classes for instance checks..
See also the snippet $140
typevars
from fancy_collections import DictOfPandas
import pandas as pd
# in: df or dip
# out: df or dip
# docstring: "FrameT1"
FrameT1 = TypeVar("FrameT1", bound=Union[pd.DataFrame, DictOfPandas])
# in: df or dip
# out: same as in (df->df, dip->dip)
# docstring: "FrameT2"
FrameT2 = TypeVar("FrameT2", pd.DataFrame, DictOfPandas)
# in: df or dip
# out: df or dip
# docstring: "pd.DataFrame | DictOfPandas"
FrameT3 = Union[pd.DataFrame, DictOfPandas]
# naming suggestions
DfOrDipUnion = FrameT3
DfOrDip = FrameT2
ABC
from fancy_collections import DictOfPandas
from saqc import DictOfSeries
import pandas as pd
# see https://docs.python.org/3/library/abc.html#abc.ABCMeta.register
class Frame(ABC): pass
Frame.register(pd.DataFrame)
Frame.register(DictOfPandas)
assert isinstance(pd.DataFrame(), Frame)
assert isinstance(DictOfPandas(), Frame)
assert isinstance(DictOfSeries(), Frame)
# True
ABC advanced
class FrameLike(ABC):
def __new__(cls, *args, **kwargs):
raise TypeError("Cannot instantiate FrameLike")
@property
@abstractmethod
def columns(self) -> pd.Index:
...
@classmethod
def __subclasshook__(cls, C):
print(cls, C)
# just and example, we need more checks: __get/setitem__, __len__ etc.
if any("columns" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented
assert isinstance(pd.DataFrame(), Frame)
assert isinstance(DictOfPandas(), Frame)
assert isinstance(DictOfSeries(), Frame)
# True