|
6 | 6 | from __future__ import annotations |
7 | 7 |
|
8 | 8 | from io import BytesIO |
9 | | -from typing import TYPE_CHECKING |
| 9 | +from typing import TYPE_CHECKING, Any |
10 | 10 |
|
11 | 11 | if TYPE_CHECKING: |
12 | 12 | from altair.vegalite.v5.schema.core import TopLevelSpec as Altair |
|
16 | 16 | from skore.item.item import Item |
17 | 17 |
|
18 | 18 |
|
| 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 | + |
19 | 26 | class MediaItem(Item): |
20 | 27 | """ |
21 | 28 | A class to represent a media item. |
@@ -76,19 +83,15 @@ def factory(cls, media, *args, **kwargs): |
76 | 83 | MediaItem |
77 | 84 | A new MediaItem instance. |
78 | 85 | """ |
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"): |
84 | 87 | return cls.factory_bytes(media, *args, **kwargs) |
85 | | - if "builtins.str" in media_mro_fullnames: |
| 88 | + if lazy_is_instance(media, "builtins.str"): |
86 | 89 | 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"): |
88 | 91 | 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"): |
90 | 93 | 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"): |
92 | 95 | return cls.factory_pillow(media, *args, **kwargs) |
93 | 96 |
|
94 | 97 | raise NotImplementedError(f"Type '{media.__class__}' is not yet supported") |
|
0 commit comments