Skip to content

Commit 27cf3c5

Browse files
Replace third-part libraries imports by lazy imports (#350)
Fix missing imports in project.py by implementing a lazy isinstance function. --------- Co-authored-by: Auguste Baum <[email protected]>
1 parent bd82562 commit 27cf3c5

File tree

2 files changed

+20
-24
lines changed

2 files changed

+20
-24
lines changed

src/skore/item/media_item.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from __future__ import annotations
77

88
from io import BytesIO
9-
from typing import TYPE_CHECKING
9+
from typing import TYPE_CHECKING, Any
1010

1111
if TYPE_CHECKING:
1212
from altair.vegalite.v5.schema.core import TopLevelSpec as Altair
@@ -16,6 +16,13 @@
1616
from skore.item.item import Item
1717

1818

19+
def lazy_is_instance(object: Any, cls_fullname: str) -> bool:
20+
"""Return True if object is an instance of a class named `cls_fullname`."""
21+
return cls_fullname in {
22+
f"{cls.__module__}.{cls.__name__}" for cls in object.__class__.__mro__
23+
}
24+
25+
1926
class MediaItem(Item):
2027
"""
2128
A class to represent a media item.
@@ -76,19 +83,15 @@ def factory(cls, media, *args, **kwargs):
7683
MediaItem
7784
A new MediaItem instance.
7885
"""
79-
media_mro_fullnames = {
80-
f"{cls.__module__}.{cls.__name__}" for cls in media.__class__.__mro__
81-
}
82-
83-
if "builtins.bytes" in media_mro_fullnames:
86+
if lazy_is_instance(media, "builtins.bytes"):
8487
return cls.factory_bytes(media, *args, **kwargs)
85-
if "builtins.str" in media_mro_fullnames:
88+
if lazy_is_instance(media, "builtins.str"):
8689
return cls.factory_str(media, *args, **kwargs)
87-
if "altair.vegalite.v5.schema.core.TopLevelSpec" in media_mro_fullnames:
90+
if lazy_is_instance(media, "altair.vegalite.v5.schema.core.TopLevelSpec"):
8891
return cls.factory_altair(media, *args, **kwargs)
89-
if "matplotlib.figure.Figure" in media_mro_fullnames:
92+
if lazy_is_instance(media, "matplotlib.figure.Figure"):
9093
return cls.factory_matplotlib(media, *args, **kwargs)
91-
if "PIL.Image.Image" in media_mro_fullnames:
94+
if lazy_is_instance(media, "PIL.Image.Image"):
9295
return cls.factory_pillow(media, *args, **kwargs)
9396

9497
raise NotImplementedError(f"Type '{media.__class__}' is not yet supported")

src/skore/project.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,9 @@
33
from pathlib import Path
44
from typing import Any
55

6-
import altair
7-
import matplotlib
8-
import numpy
9-
import pandas
10-
import PIL
11-
import sklearn
12-
136
from skore.item import Item
147
from skore.item.item_repository import ItemRepository
15-
from skore.item.media_item import MediaItem
8+
from skore.item.media_item import MediaItem, lazy_is_instance
169
from skore.item.numpy_array_item import NumpyArrayItem
1710
from skore.item.pandas_dataframe_item import PandasDataFrameItem
1811
from skore.item.primitive_item import PrimitiveItem, is_primitive
@@ -25,17 +18,17 @@ def object_to_item(o: Any) -> Item:
2518
"""Transform an object into an Item."""
2619
if is_primitive(o):
2720
return PrimitiveItem.factory(o)
28-
elif isinstance(o, pandas.DataFrame):
21+
elif lazy_is_instance(o, "pandas.core.frame.DataFrame"):
2922
return PandasDataFrameItem.factory(o)
30-
elif isinstance(o, numpy.ndarray):
23+
elif lazy_is_instance(o, "numpy.ndarray"):
3124
return NumpyArrayItem.factory(o)
32-
elif isinstance(o, sklearn.base.BaseEstimator):
25+
elif lazy_is_instance(o, "sklearn.base.BaseEstimator"):
3326
return SklearnBaseEstimatorItem.factory(o)
34-
elif isinstance(o, altair.vegalite.v5.schema.core.TopLevelSpec):
27+
elif lazy_is_instance(o, "altair.vegalite.v5.schema.core.TopLevelSpec"):
3528
return MediaItem.factory_altair(o)
36-
elif isinstance(o, matplotlib.figure.Figure):
29+
elif lazy_is_instance(o, "matplotlib.figure.Figure"):
3730
return MediaItem.factory_matplotlib(o)
38-
elif isinstance(o, PIL.Image.Image):
31+
elif lazy_is_instance(o, "PIL.Image.Image"):
3932
return MediaItem.factory_pillow(o)
4033
else:
4134
raise NotImplementedError(f"Type {o.__class__.__name__} is not supported yet.")

0 commit comments

Comments
 (0)