diff --git a/src/neo4j/vector.py b/src/neo4j/vector.py index ca01ad76..50303061 100644 --- a/src/neo4j/vector.py +++ b/src/neo4j/vector.py @@ -53,6 +53,9 @@ ] +_DEFAULT = object() + + class Vector: r""" A class representing a Neo4j vector. @@ -753,10 +756,11 @@ def _from_native_rust(cls, data: _t.Iterable[object], /) -> _t.Self: @classmethod def _from_native_np(cls, data: _t.Iterable[object], /) -> _t.Self: data = tuple(data) - non_float = tuple(item for item in data if not isinstance(item, float)) - if non_float: + non_float_gen = (item for item in data if not isinstance(item, float)) + non_float = next(non_float_gen, _DEFAULT) + if non_float is not _DEFAULT: raise TypeError( - f"Cannot build f64 vector from {type(non_float[0]).__name__}, " + f"Cannot build f64 vector from {type(non_float).__name__}, " "expected float." ) return cls(_np.fromiter(data, dtype=_np.dtype(">f8")).tobytes()) @@ -826,10 +830,11 @@ def _from_native_rust(cls, data: _t.Iterable[object], /) -> _t.Self: @classmethod def _from_native_np(cls, data: _t.Iterable[object], /) -> _t.Self: data = tuple(data) - non_float = tuple(item for item in data if not isinstance(item, float)) - if non_float: + non_float_gen = (item for item in data if not isinstance(item, float)) + non_float = next(non_float_gen, _DEFAULT) + if non_float is not _DEFAULT: raise TypeError( - f"Cannot build f32 vector from {type(non_float[0]).__name__}, " + f"Cannot build f32 vector from {type(non_float).__name__}, " "expected float." ) return cls(_np.fromiter(data, dtype=_np.dtype(">f4")).tobytes()) @@ -903,10 +908,11 @@ def _from_native_rust(cls, data: _t.Iterable[object], /) -> _t.Self: @classmethod def _from_native_np(cls, data: _t.Iterable[object], /) -> _t.Self: data = tuple(data) - non_int = tuple(item for item in data if not isinstance(item, int)) - if non_int: + non_int_gen = (item for item in data if not isinstance(item, int)) + non_int = next(non_int_gen, _DEFAULT) + if non_int is not _DEFAULT: raise TypeError( - f"Cannot build i64 vector from {type(non_int[0]).__name__}, " + f"Cannot build i64 vector from {type(non_int).__name__}, " "expected int." ) data = _t.cast(tuple[int, ...], data) @@ -994,10 +1000,11 @@ def _from_native_rust(cls, data: _t.Iterable[object], /) -> _t.Self: @classmethod def _from_native_np(cls, data: _t.Iterable[object], /) -> _t.Self: data = tuple(data) - non_int = tuple(item for item in data if not isinstance(item, int)) - if non_int: + non_int_gen = (item for item in data if not isinstance(item, int)) + non_int = next(non_int_gen, _DEFAULT) + if non_int is not _DEFAULT: raise TypeError( - f"Cannot build i32 vector from {type(non_int[0]).__name__}, " + f"Cannot build i32 vector from {type(non_int).__name__}, " "expected int." ) data = _t.cast(tuple[int, ...], data) @@ -1085,10 +1092,11 @@ def _from_native_rust(cls, data: _t.Iterable[object], /) -> _t.Self: @classmethod def _from_native_np(cls, data: _t.Iterable[object], /) -> _t.Self: data = tuple(data) - non_int = tuple(item for item in data if not isinstance(item, int)) - if non_int: + non_int_gen = (item for item in data if not isinstance(item, int)) + non_int = next(non_int_gen, _DEFAULT) + if non_int is not _DEFAULT: raise TypeError( - f"Cannot build i16 vector from {type(non_int[0]).__name__}, " + f"Cannot build i16 vector from {type(non_int).__name__}, " "expected int." ) data = _t.cast(tuple[int, ...], data) @@ -1176,10 +1184,11 @@ def _from_native_rust(cls, data: _t.Iterable[object], /) -> _t.Self: @classmethod def _from_native_np(cls, data: _t.Iterable[object], /) -> _t.Self: data = tuple(data) - non_int = tuple(item for item in data if not isinstance(item, int)) - if non_int: + non_int_gen = (item for item in data if not isinstance(item, int)) + non_int = next(non_int_gen, _DEFAULT) + if non_int is not _DEFAULT: raise TypeError( - f"Cannot build i8 vector from {type(non_int[0]).__name__}, " + f"Cannot build i8 vector from {type(non_int).__name__}, " "expected int." ) data = _t.cast(tuple[int, ...], data)