Skip to content

Commit 4247b5c

Browse files
committed
Fix FloatItem, IntItem and ChoiceItem: use _set_value_with_validation for type conversion and validation
1 parent 3e48e6c commit 4247b5c

1 file changed

Lines changed: 16 additions & 9 deletions

File tree

guidata/dataset/dataitems.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -278,8 +278,10 @@ def __init__(
278278
self.set_prop("display", slider=slider)
279279
self.set_prop("data", step=step)
280280

281-
def __set__(self, instance: Any, value: Any) -> None:
282-
"""Override DataItem.__set__ to convert integers to float"""
281+
def _set_value_with_validation(
282+
self, instance: Any, value: Any, force_allow_none: bool = False
283+
) -> None:
284+
"""Override DataItem._set_value_with_validation to convert integers to float"""
283285
# Try to convert NumPy numeric types to Python float
284286
# (will convert silently either floating point or integer types to float)
285287
try:
@@ -291,7 +293,7 @@ def __set__(self, instance: Any, value: Any) -> None:
291293
# (no more NumPy types at this point)
292294
if isinstance(value, int):
293295
value = float(value)
294-
super().__set__(instance, value)
296+
super()._set_value_with_validation(instance, value, force_allow_none)
295297

296298
def get_value_from_reader(
297299
self, reader: HDF5Reader | JSONReader | INIReader
@@ -362,16 +364,19 @@ def get_auto_help(self, instance: DataSet) -> str:
362364
auto_help += ", " + _("odd")
363365
return auto_help
364366

365-
def __set__(self, instance: Any, value: Any) -> None:
366-
"""Override DataItem.__set__ to convert NumPy numeric types to int"""
367+
def _set_value_with_validation(
368+
self, instance: Any, value: Any, force_allow_none: bool = False
369+
) -> None:
370+
"""Override DataItem._set_value_with_validation
371+
to convert NumPy numeric types to int"""
367372
# Try to convert NumPy integer types to Python int
368373
# (will convert silently only integer types to int)
369374
try:
370375
if isinstance(value, np.integer):
371376
value = self.type(value)
372377
except (TypeError, ValueError):
373378
pass
374-
super().__set__(instance, value)
379+
super()._set_value_with_validation(instance, value, force_allow_none)
375380

376381
def check_value(self, value: int, raise_exception: bool = False) -> bool:
377382
"""Override DataItem method"""
@@ -1015,11 +1020,13 @@ def get_value(self, instance: DataSet) -> str | None:
10151020
# guidata internals should call this; keep it returning the raw key
10161021
return super().__get__(instance, instance.__class__) # string (or None)
10171022

1018-
def __set__(self, instance: DataSet, value: Any) -> None:
1019-
"""Override DataItem.__set__ to accept Enum members"""
1023+
def _set_value_with_validation(
1024+
self, instance: Any, value: Any, force_allow_none: bool = False
1025+
) -> None:
1026+
"""Override DataItem._set_value_with_validation to accept Enum members"""
10201027
if self._enum_cls is not None and value is not None:
10211028
value = self._enum_coerce_in(value) # → member.name
1022-
super().__set__(instance, value)
1029+
super()._set_value_with_validation(instance, value, force_allow_none)
10231030

10241031
def _normalize_choice(
10251032
self, idx: int, choice_tuple: tuple[Any, ...]

0 commit comments

Comments
 (0)