|
2 | 2 | from __future__ import annotations |
3 | 3 |
|
4 | 4 | from dataclasses import asdict, dataclass |
5 | | -from typing import Any |
| 5 | +from typing import TYPE_CHECKING, Any |
6 | 6 |
|
7 | 7 | import openml.flows |
| 8 | +from openml.utils import ReprMixin |
8 | 9 |
|
| 10 | +if TYPE_CHECKING: |
| 11 | + from collections.abc import Sequence |
9 | 12 |
|
10 | | -@dataclass |
11 | | -class OpenMLSetup: |
| 13 | + |
| 14 | +@dataclass(repr=False) |
| 15 | +class OpenMLSetup(ReprMixin): |
12 | 16 | """Setup object (a.k.a. Configuration). |
13 | 17 |
|
14 | 18 | Parameters |
@@ -44,31 +48,22 @@ def _to_dict(self) -> dict[str, Any]: |
44 | 48 | else None, |
45 | 49 | } |
46 | 50 |
|
47 | | - def __repr__(self) -> str: |
48 | | - header = "OpenML Setup" |
49 | | - header = f"{header}\n{'=' * len(header)}\n" |
50 | | - |
51 | | - fields = { |
| 51 | + def _get_repr_body_fields(self) -> Sequence[tuple[str, str | int | list[str] | None]]: |
| 52 | + """Collect all information to display in the __repr__ body.""" |
| 53 | + fields: dict[str, int | str | None] = { |
52 | 54 | "Setup ID": self.setup_id, |
53 | 55 | "Flow ID": self.flow_id, |
54 | 56 | "Flow URL": openml.flows.OpenMLFlow.url_for_id(self.flow_id), |
55 | | - "# of Parameters": ( |
56 | | - len(self.parameters) if self.parameters is not None else float("nan") |
57 | | - ), |
| 57 | + "# of Parameters": (len(self.parameters) if self.parameters is not None else "nan"), |
58 | 58 | } |
59 | 59 |
|
60 | 60 | # determines the order in which the information will be printed |
61 | 61 | order = ["Setup ID", "Flow ID", "Flow URL", "# of Parameters"] |
62 | | - _fields = [(key, fields[key]) for key in order if key in fields] |
63 | | - |
64 | | - longest_field_name_length = max(len(name) for name, _ in _fields) |
65 | | - field_line_format = f"{{:.<{longest_field_name_length}}}: {{}}" |
66 | | - body = "\n".join(field_line_format.format(name, value) for name, value in _fields) |
67 | | - return header + body |
| 62 | + return [(key, fields[key]) for key in order if key in fields] |
68 | 63 |
|
69 | 64 |
|
70 | | -@dataclass |
71 | | -class OpenMLParameter: |
| 65 | +@dataclass(repr=False) |
| 66 | +class OpenMLParameter(ReprMixin): |
72 | 67 | """Parameter object (used in setup). |
73 | 68 |
|
74 | 69 | Parameters |
@@ -112,11 +107,9 @@ def _to_dict(self) -> dict[str, Any]: |
112 | 107 | result["id"] = result.pop("input_id") |
113 | 108 | return result |
114 | 109 |
|
115 | | - def __repr__(self) -> str: |
116 | | - header = "OpenML Parameter" |
117 | | - header = f"{header}\n{'=' * len(header)}\n" |
118 | | - |
119 | | - fields = { |
| 110 | + def _get_repr_body_fields(self) -> Sequence[tuple[str, str | int | list[str] | None]]: |
| 111 | + """Collect all information to display in the __repr__ body.""" |
| 112 | + fields: dict[str, int | str | None] = { |
120 | 113 | "ID": self.id, |
121 | 114 | "Flow ID": self.flow_id, |
122 | 115 | # "Flow Name": self.flow_name, |
@@ -145,9 +138,4 @@ def __repr__(self) -> str: |
145 | 138 | parameter_default, |
146 | 139 | parameter_value, |
147 | 140 | ] |
148 | | - _fields = [(key, fields[key]) for key in order if key in fields] |
149 | | - |
150 | | - longest_field_name_length = max(len(name) for name, _ in _fields) |
151 | | - field_line_format = f"{{:.<{longest_field_name_length}}}: {{}}" |
152 | | - body = "\n".join(field_line_format.format(name, value) for name, value in _fields) |
153 | | - return header + body |
| 141 | + return [(key, fields[key]) for key in order if key in fields] |
0 commit comments