From 922d613b4298eb3589a977a4bcbace1b605b43d0 Mon Sep 17 00:00:00 2001 From: Shawn Boltz <73495214+shawnboltz@users.noreply.github.com> Date: Sun, 7 Dec 2025 13:55:49 -0800 Subject: [PATCH] Improved support for numpy number types --- lonboard/_map.py | 7 ++++--- lonboard/traits/_extensions.py | 2 +- lonboard/traits/_float.py | 2 +- lonboard/traits/_map.py | 3 ++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lonboard/_map.py b/lonboard/_map.py index ad685518..3d12261d 100644 --- a/lonboard/_map.py +++ b/lonboard/_map.py @@ -6,6 +6,7 @@ from typing import IO, TYPE_CHECKING, Any, TextIO, overload import ipywidgets +import numpy as np import traitlets as t from ipywidgets import CallbackDispatcher @@ -632,17 +633,17 @@ def fly_to( # noqa: PLR0913 specified speed is ignored. """ # noqa: D210 - if not isinstance(longitude, (int, float)): + if not isinstance(longitude, (int, float, np.number)): raise TypeError( f"Expected longitude to be an int or float, got {type(longitude)}", ) - if not isinstance(latitude, (int, float)): + if not isinstance(latitude, (int, float, np.number)): raise TypeError( f"Expected latitude to be an int or float, got {type(latitude)}", ) - if not isinstance(zoom, (int, float)): + if not isinstance(zoom, (int, float, np.number)): raise TypeError(f"Expected zoom to be an int or float, got {type(zoom)}") data = { diff --git a/lonboard/traits/_extensions.py b/lonboard/traits/_extensions.py index dc3b8cf7..e1170255 100644 --- a/lonboard/traits/_extensions.py +++ b/lonboard/traits/_extensions.py @@ -141,7 +141,7 @@ def validate( assert len(data_filter_extension) == 1 filter_size = data_filter_extension[0].filter_size # type: ignore - if isinstance(value, (int, float)): + if isinstance(value, (int, float, np.number)): if filter_size != 1: self.error(obj, value, info="filter_size==1 with scalar value") diff --git a/lonboard/traits/_float.py b/lonboard/traits/_float.py index ef3ee5b8..1cd796ef 100644 --- a/lonboard/traits/_float.py +++ b/lonboard/traits/_float.py @@ -65,7 +65,7 @@ def _numpy_to_arrow(self, obj: BaseArrowLayer, value: np.ndarray) -> ChunkedArra return ChunkedArray([value.astype(np.float32)]) def validate(self, obj: BaseArrowLayer, value: Any) -> float | ChunkedArray: - if isinstance(value, (int, float)): + if isinstance(value, (int, float, np.number)): return float(value) # pandas Series diff --git a/lonboard/traits/_map.py b/lonboard/traits/_map.py index 5bbe4006..1c2fd0a4 100644 --- a/lonboard/traits/_map.py +++ b/lonboard/traits/_map.py @@ -4,6 +4,7 @@ from typing import TYPE_CHECKING, Any from urllib.parse import urlparse +import numpy as np import traitlets from lonboard._environment import DEFAULT_HEIGHT @@ -58,7 +59,7 @@ def __init__( self.tag(sync=True) def validate(self, obj: Any, value: Any) -> str: - if isinstance(value, int): + if isinstance(value, (int, np.integer)): return f"{value}px" if isinstance(value, str):