Skip to content

Commit faefc59

Browse files
authored
Merge pull request #30 from csdms/mcflugen/fix-float-as-int-parameter
Truncate floats when passed to IntParameter
2 parents 9a319b4 + 53bf623 commit faefc59

File tree

2 files changed

+34
-7
lines changed

2 files changed

+34
-7
lines changed

src/model_metadata/model_parameter.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -238,13 +238,13 @@ def __init__(
238238
if range_ is not None and len(range_) != 2:
239239
raise ValueError("range must be either None or (min, max)")
240240

241-
try:
242-
value = int(value)
243-
except ValueError:
244-
value = float(value)
245-
finally:
246-
if not isinstance(value, (int, float)):
247-
raise ValueError("value is not a number")
241+
if isinstance(value, str):
242+
try:
243+
value = int(value)
244+
except ValueError:
245+
value = float(value)
246+
if not isinstance(value, (int, float)):
247+
raise ValueError("value is not a number")
248248

249249
super().__init__(value, desc=desc)
250250

@@ -382,6 +382,14 @@ def __init__(
382382
range: tuple[int, int] | None = None,
383383
units: str | None = None,
384384
):
385+
if isinstance(value, float):
386+
warnings.warn(
387+
f"{value}: floating point number passed as an integer parameter, value"
388+
f" will be truncated to {int(value)}",
389+
stacklevel=2,
390+
)
391+
value = int(value)
392+
385393
if not isinstance(value, (int, str)):
386394
raise ValueError(
387395
"value must be either an int or a string that can be converted to"

tests/parameter_test.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from __future__ import annotations
2+
3+
import pytest
4+
from model_metadata.model_parameter import FloatParameter
5+
from model_metadata.model_parameter import IntParameter
6+
7+
8+
@pytest.mark.parametrize("value", (1973, 1973.0, 1973.5, "1973"))
9+
def test_int_parameter(value):
10+
p = IntParameter(value)
11+
assert isinstance(p.value, int)
12+
assert p.value == 1973
13+
14+
15+
@pytest.mark.parametrize("value", (3.14, "3.14"))
16+
def test_float_parameter(value):
17+
p = FloatParameter(value)
18+
assert isinstance(p.value, float)
19+
assert p.value == 3.14

0 commit comments

Comments
 (0)