From 98e7722421aa828763e30e289d44e588b22dea6b Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Sat, 7 Jun 2025 13:31:56 +0200 Subject: [PATCH 1/2] Fix shapely return types coming from numpy ufuncs --- stubs/shapely/shapely/_geometry.pyi | 26 ++++---- stubs/shapely/shapely/algorithms/cga.pyi | 4 +- stubs/shapely/shapely/linear.pyi | 2 +- stubs/shapely/shapely/measurement.pyi | 14 ++--- stubs/shapely/shapely/predicates.pyi | 60 +++++++++---------- stubs/shapely/shapely/strtree.pyi | 2 +- stubs/shapely/shapely/vectorized/__init__.pyi | 8 +-- 7 files changed, 59 insertions(+), 57 deletions(-) diff --git a/stubs/shapely/shapely/_geometry.pyi b/stubs/shapely/shapely/_geometry.pyi index eb2cdab6cec9..d2e2055bce02 100644 --- a/stubs/shapely/shapely/_geometry.pyi +++ b/stubs/shapely/shapely/_geometry.pyi @@ -52,23 +52,23 @@ class GeometryType(IntEnum): GEOMETRYCOLLECTION = 7 @overload -def get_type_id(geometry: Geometry | None, **kwargs) -> int: ... +def get_type_id(geometry: Geometry | None, **kwargs) -> np.int32: ... @overload def get_type_id(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.int64]: ... @overload -def get_dimensions(geometry: Geometry | None, **kwargs) -> int: ... +def get_dimensions(geometry: Geometry | None, **kwargs) -> np.int32: ... @overload def get_dimensions(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.int64]: ... @overload -def get_coordinate_dimension(geometry: Geometry | None, **kwargs) -> int: ... +def get_coordinate_dimension(geometry: Geometry | None, **kwargs) -> np.int32: ... @overload def get_coordinate_dimension(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.int64]: ... @overload -def get_num_coordinates(geometry: Geometry | None, **kwargs) -> int: ... +def get_num_coordinates(geometry: Geometry | None, **kwargs) -> np.int32: ... @overload def get_num_coordinates(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.int64]: ... @overload -def get_srid(geometry: Geometry | None, **kwargs) -> int: ... +def get_srid(geometry: Geometry | None, **kwargs) -> np.int32: ... @overload def get_srid(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.int64]: ... @overload @@ -78,19 +78,19 @@ def set_srid(geometry: OptGeoArrayLikeSeq, srid: ArrayLike[SupportsIndex], **kwa @overload def set_srid(geometry: OptGeoArrayLike, srid: ArrayLikeSeq[SupportsIndex], **kwargs) -> GeoArray: ... @overload -def get_x(point: Geometry | None, **kwargs) -> float: ... +def get_x(point: Geometry | None, **kwargs) -> np.float64: ... @overload def get_x(point: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.float64]: ... @overload -def get_y(point: Geometry | None, **kwargs) -> float: ... +def get_y(point: Geometry | None, **kwargs) -> np.float64: ... @overload def get_y(point: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.float64]: ... @overload -def get_z(point: Geometry | None, **kwargs) -> float: ... +def get_z(point: Geometry | None, **kwargs) -> np.float64: ... @overload def get_z(point: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.float64]: ... @overload -def get_m(point: Geometry | None, **kwargs) -> float: ... +def get_m(point: Geometry | None, **kwargs) -> np.float64: ... @overload def get_m(point: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.float64]: ... @overload @@ -104,7 +104,7 @@ def get_point(geometry: OptGeoArrayLikeSeq, index: ArrayLike[SupportsIndex], **k @overload def get_point(geometry: OptGeoArrayLike, index: ArrayLikeSeq[SupportsIndex], **kwargs) -> GeoArray: ... @overload -def get_num_points(geometry: Geometry | None, **kwargs) -> int: ... +def get_num_points(geometry: Geometry | None, **kwargs) -> np.int32: ... @overload def get_num_points(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.int64]: ... @overload @@ -126,7 +126,7 @@ def get_interior_ring(geometry: OptGeoArrayLikeSeq, index: ArrayLike[SupportsInd @overload def get_interior_ring(geometry: OptGeoArrayLike, index: ArrayLikeSeq[SupportsIndex], **kwargs) -> GeoArray: ... @overload -def get_num_interior_rings(geometry: Geometry | None, **kwargs) -> int: ... +def get_num_interior_rings(geometry: Geometry | None, **kwargs) -> np.int32: ... @overload def get_num_interior_rings(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.int64]: ... @overload @@ -158,11 +158,11 @@ def get_rings(geometry: OptGeoArrayLike, return_index: Literal[True]) -> tuple[G @overload def get_rings(geometry: OptGeoArrayLike, return_index: bool) -> GeoArray | tuple[GeoArray, NDArray[np.int64]]: ... @overload -def get_num_geometries(geometry: Geometry | None, **kwargs) -> int: ... +def get_num_geometries(geometry: Geometry | None, **kwargs) -> np.int32: ... @overload def get_num_geometries(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.int64]: ... @overload -def get_precision(geometry: Geometry | None, **kwargs) -> float: ... +def get_precision(geometry: Geometry | None, **kwargs) -> np.float64: ... @overload def get_precision(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.float64]: ... diff --git a/stubs/shapely/shapely/algorithms/cga.pyi b/stubs/shapely/shapely/algorithms/cga.pyi index d3d7ea164660..de6ecd5ed1cc 100644 --- a/stubs/shapely/shapely/algorithms/cga.pyi +++ b/stubs/shapely/shapely/algorithms/cga.pyi @@ -1,3 +1,5 @@ +import numpy as np + from ..geometry import LinearRing -def signed_area(ring: LinearRing) -> float: ... +def signed_area(ring: LinearRing) -> np.float64: ... diff --git a/stubs/shapely/shapely/linear.pyi b/stubs/shapely/shapely/linear.pyi index c7be17806dd8..10701f0c5ed7 100644 --- a/stubs/shapely/shapely/linear.pyi +++ b/stubs/shapely/shapely/linear.pyi @@ -30,7 +30,7 @@ def line_interpolate_point( @overload def line_locate_point( line: LineString | MultiLineString | GeometryCollection | None, other: Point | None, normalized: bool = False, **kwargs -) -> float: ... +) -> np.float64: ... @overload def line_locate_point( line: LineString | MultiLineString | GeometryCollection | None, other: OptGeoArrayLikeSeq, normalized: bool = False, **kwargs diff --git a/stubs/shapely/shapely/measurement.pyi b/stubs/shapely/shapely/measurement.pyi index 69d9a0c40654..c50e642a9cf8 100644 --- a/stubs/shapely/shapely/measurement.pyi +++ b/stubs/shapely/shapely/measurement.pyi @@ -19,11 +19,11 @@ __all__ = [ ] @overload -def area(geometry: Geometry | None, **kwargs) -> float: ... +def area(geometry: Geometry | None, **kwargs) -> np.float64: ... @overload def area(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.float64]: ... @overload -def distance(a: Geometry | None, b: Geometry | None, **kwargs) -> float: ... +def distance(a: Geometry | None, b: Geometry | None, **kwargs) -> np.float64: ... @overload def distance(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.float64]: ... @overload @@ -31,11 +31,11 @@ def distance(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np. def bounds(geometry: OptGeoArrayLike, **kwargs) -> NDArray[np.float64]: ... def total_bounds(geometry: OptGeoArrayLike, **kwargs) -> NDArray[np.float64]: ... @overload -def length(geometry: Geometry | None, **kwargs) -> float: ... +def length(geometry: Geometry | None, **kwargs) -> np.float64: ... @overload def length(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.float64]: ... @overload -def hausdorff_distance(a: Geometry | None, b: Geometry | None, densify: float | None = None, **kwargs) -> float: ... +def hausdorff_distance(a: Geometry | None, b: Geometry | None, densify: float | None = None, **kwargs) -> np.float64: ... @overload def hausdorff_distance(a: OptGeoArrayLike, b: OptGeoArrayLike, densify: ArrayLikeSeq[float], **kwargs) -> NDArray[np.float64]: ... @overload @@ -47,7 +47,7 @@ def hausdorff_distance( a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, densify: ArrayLike[float] | None = None, **kwargs ) -> NDArray[np.float64]: ... @overload -def frechet_distance(a: Geometry | None, b: Geometry | None, densify: float | None = None, **kwargs) -> float: ... +def frechet_distance(a: Geometry | None, b: Geometry | None, densify: float | None = None, **kwargs) -> np.float64: ... @overload def frechet_distance(a: OptGeoArrayLike, b: OptGeoArrayLike, densify: ArrayLikeSeq[float], **kwargs) -> NDArray[np.float64]: ... @overload @@ -59,10 +59,10 @@ def frechet_distance( a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, densify: ArrayLike[float] | None = None, **kwargs ) -> NDArray[np.float64]: ... @overload -def minimum_clearance(geometry: Geometry | None, **kwargs) -> float: ... +def minimum_clearance(geometry: Geometry | None, **kwargs) -> np.float64: ... @overload def minimum_clearance(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.float64]: ... @overload -def minimum_bounding_radius(geometry: Geometry | None, **kwargs) -> float: ... +def minimum_bounding_radius(geometry: Geometry | None, **kwargs) -> np.float64: ... @overload def minimum_bounding_radius(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.float64]: ... diff --git a/stubs/shapely/shapely/predicates.pyi b/stubs/shapely/shapely/predicates.pyi index 3b4fe369b980..34adaa22bb7b 100644 --- a/stubs/shapely/shapely/predicates.pyi +++ b/stubs/shapely/shapely/predicates.pyi @@ -43,57 +43,57 @@ __all__ = [ ] @overload -def has_z(geometry: Geometry | None, **kwargs) -> bool: ... +def has_z(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def has_z(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def has_m(geometry: Geometry | None, **kwargs) -> bool: ... +def has_m(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def has_m(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def is_ccw(geometry: Geometry | None, **kwargs) -> bool: ... +def is_ccw(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def is_ccw(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def is_closed(geometry: Geometry | None, **kwargs) -> bool: ... +def is_closed(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def is_closed(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def is_empty(geometry: Geometry | None, **kwargs) -> bool: ... +def is_empty(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def is_empty(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def is_geometry(geometry: Geometry, **kwargs) -> Literal[True]: ... +def is_geometry(geometry: Geometry, **kwargs) -> np.bool_[Literal[True]]: ... @overload def is_geometry(geometry: ArrayLikeSeq[Any], **kwargs) -> NDArray[np.bool_]: ... # type: ignore[overload-overlap] @overload def is_geometry(geometry: object, **kwargs) -> TypeGuard[BaseGeometry]: ... @overload -def is_missing(geometry: Geometry, **kwargs) -> Literal[True]: ... +def is_missing(geometry: Geometry, **kwargs) -> np.bool_[Literal[False]]: ... @overload def is_missing(geometry: ArrayLikeSeq[Any], **kwargs) -> NDArray[np.bool_]: ... # type: ignore[overload-overlap] @overload -def is_missing(geometry: object, **kwargs) -> TypeGuard[BaseGeometry]: ... +def is_missing(geometry: object, **kwargs) -> TypeGuard[None]: ... @overload -def is_prepared(geometry: Geometry | None, **kwargs) -> bool: ... +def is_prepared(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def is_prepared(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def is_valid_input(geometry: Geometry | None, **kwargs) -> Literal[True]: ... +def is_valid_input(geometry: Geometry | None, **kwargs) -> np.bool_[Literal[True]]: ... @overload def is_valid_input(geometry: ArrayLikeSeq[Any], **kwargs) -> NDArray[np.bool_]: ... # type: ignore[overload-overlap] @overload def is_valid_input(geometry: object, **kwargs) -> TypeGuard[BaseGeometry | None]: ... @overload -def is_ring(geometry: Geometry | None, **kwargs) -> bool: ... +def is_ring(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def is_ring(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def is_simple(geometry: Geometry | None, **kwargs) -> bool: ... +def is_simple(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def is_simple(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def is_valid(geometry: Geometry | None, **kwargs) -> bool: ... +def is_valid(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def is_valid(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload @@ -103,67 +103,67 @@ def is_valid_reason(geometry: Geometry, **kwargs) -> str: ... @overload def is_valid_reason(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.object_]: ... @overload -def crosses(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def crosses(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def crosses(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload def crosses(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def contains(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def contains(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def contains(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload def contains(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def contains_properly(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def contains_properly(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def contains_properly(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload def contains_properly(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def covered_by(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def covered_by(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def covered_by(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload def covered_by(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def covers(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def covers(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def covers(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload def covers(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def disjoint(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def disjoint(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def disjoint(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload def disjoint(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def equals(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def equals(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def equals(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload def equals(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def intersects(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def intersects(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def intersects(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload def intersects(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def overlaps(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def overlaps(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def overlaps(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload def overlaps(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def touches(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def touches(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def touches(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload def touches(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def within(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def within(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def within(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload @@ -171,7 +171,7 @@ def within(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bo @overload def equals_exact( a: Geometry | None, b: Geometry | None, tolerance: float = 0.0, *, normalize: bool = False, **kwargs -) -> bool: ... +) -> np.bool_: ... @overload def equals_exact( a: OptGeoArrayLike, b: OptGeoArrayLike, tolerance: ArrayLikeSeq[float], *, normalize: bool = False, **kwargs @@ -185,7 +185,7 @@ def equals_exact( a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, tolerance: ArrayLike[float] = 0.0, *, normalize: bool = False, **kwargs ) -> NDArray[np.bool_]: ... @overload -def equals_identical(a: Geometry | None, b: Geometry | None, **kwargs) -> bool: ... +def equals_identical(a: Geometry | None, b: Geometry | None, **kwargs) -> np.bool_: ... @overload def equals_identical(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.bool_]: ... @overload @@ -201,19 +201,19 @@ def relate(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, **kwargs) -> NDArray[np.ob @overload def relate(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.object_]: ... @overload -def relate_pattern(a: Geometry | None, b: Geometry | None, pattern: str, **kwargs) -> bool: ... +def relate_pattern(a: Geometry | None, b: Geometry | None, pattern: str, **kwargs) -> np.bool_: ... @overload def relate_pattern(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, pattern: str, **kwargs) -> NDArray[np.bool_]: ... @overload def relate_pattern(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, pattern: str, **kwargs) -> NDArray[np.bool_]: ... @overload -def dwithin(a: Geometry | None, b: Geometry | None, distance: float, **kwargs) -> bool: ... +def dwithin(a: Geometry | None, b: Geometry | None, distance: float, **kwargs) -> np.bool_: ... @overload def dwithin(a: OptGeoArrayLikeSeq, b: OptGeoArrayLike, distance: float, **kwargs) -> NDArray[np.bool_]: ... @overload def dwithin(a: OptGeoArrayLike, b: OptGeoArrayLikeSeq, distance: float, **kwargs) -> NDArray[np.bool_]: ... @overload -def contains_xy(geom: Geometry | None, x: float, y: float, **kwargs) -> bool: ... +def contains_xy(geom: Geometry | None, x: float, y: float, **kwargs) -> np.bool_: ... @overload def contains_xy(geom: OptGeoArrayLike, x: ArrayLikeSeq[float], y: None = None, **kwargs) -> NDArray[np.bool_]: ... @overload @@ -223,7 +223,7 @@ def contains_xy(geom: Geometry | None, x: ArrayLikeSeq[float], y: ArrayLike[floa @overload def contains_xy(geom: OptGeoArrayLikeSeq, x: ArrayLike[float], y: ArrayLike[float], **kwargs) -> NDArray[np.bool_]: ... @overload -def intersects_xy(geom: Geometry | None, x: float, y: float, **kwargs) -> bool: ... +def intersects_xy(geom: Geometry | None, x: float, y: float, **kwargs) -> np.bool_: ... @overload def intersects_xy(geom: OptGeoArrayLike, x: ArrayLikeSeq[float], y: None = None, **kwargs) -> NDArray[np.bool_]: ... @overload diff --git a/stubs/shapely/shapely/strtree.pyi b/stubs/shapely/shapely/strtree.pyi index d85da2e733c9..0e03e3ffc338 100644 --- a/stubs/shapely/shapely/strtree.pyi +++ b/stubs/shapely/shapely/strtree.pyi @@ -40,7 +40,7 @@ class STRtree: ) -> NDArray[np.int64]: ... # nearest may return `None` if the tree is empty, use the "Any trick" @overload - def nearest(self, geometry: Geometry) -> int | Any: ... + def nearest(self, geometry: Geometry) -> np.int64 | Any: ... @overload def nearest(self, geometry: GeoArrayLikeSeq) -> NDArray[np.int64] | Any: ... @overload # return_distance=False diff --git a/stubs/shapely/shapely/vectorized/__init__.pyi b/stubs/shapely/shapely/vectorized/__init__.pyi index 327128e4c6fd..7bec7265179a 100644 --- a/stubs/shapely/shapely/vectorized/__init__.pyi +++ b/stubs/shapely/shapely/vectorized/__init__.pyi @@ -8,7 +8,7 @@ from ..lib import Geometry from ..prepared import PreparedGeometry @overload -def contains(geometry: Geometry | PreparedGeometry[Geometry], x: float, y: float) -> bool: ... +def contains(geometry: Geometry | PreparedGeometry[Geometry], x: float, y: float) -> np.bool_: ... @overload def contains( geometry: Geometry | PreparedGeometry[Geometry], x: ArrayLikeSeq[float], y: ArrayLike[float] @@ -20,9 +20,9 @@ def contains( @overload def contains( geometry: Geometry | PreparedGeometry[Geometry], x: ArrayLike[float], y: ArrayLike[float] -) -> bool | NDArray[np.bool_]: ... +) -> np.bool_ | NDArray[np.bool_]: ... @overload -def touches(geometry: Geometry | PreparedGeometry[Geometry], x: float, y: float) -> bool: ... +def touches(geometry: Geometry | PreparedGeometry[Geometry], x: float, y: float) -> np.bool_: ... @overload def touches( geometry: Geometry | PreparedGeometry[Geometry], x: ArrayLikeSeq[float], y: ArrayLike[float] @@ -34,4 +34,4 @@ def touches( @overload def touches( geometry: Geometry | PreparedGeometry[Geometry], x: ArrayLike[float], y: ArrayLike[float] -) -> bool | NDArray[np.bool_]: ... +) -> np.bool_ | NDArray[np.bool_]: ... From 6532baa70a9b77c807a42251667e78be5100a493 Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Sat, 7 Jun 2025 14:18:40 +0200 Subject: [PATCH 2/2] Fix for old numpy on python3.9 --- stubs/shapely/shapely/predicates.pyi | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/stubs/shapely/shapely/predicates.pyi b/stubs/shapely/shapely/predicates.pyi index 34adaa22bb7b..a9e39dfadead 100644 --- a/stubs/shapely/shapely/predicates.pyi +++ b/stubs/shapely/shapely/predicates.pyi @@ -1,5 +1,6 @@ +import sys from typing import Any, Literal, overload -from typing_extensions import TypeGuard +from typing_extensions import TypeAlias, TypeGuard import numpy as np from numpy.typing import NDArray @@ -8,6 +9,13 @@ from ._typing import ArrayLike, ArrayLikeSeq, OptGeoArrayLike, OptGeoArrayLikeSe from .geometry.base import BaseGeometry from .lib import Geometry +if sys.version_info >= (3, 10): + _NPTrue: TypeAlias = np.bool_[Literal[True]] + _NPFalse: TypeAlias = np.bool_[Literal[False]] +else: + _NPTrue: TypeAlias = np.bool_ + _NPFalse: TypeAlias = np.bool_ + __all__ = [ "contains", "contains_properly", @@ -63,13 +71,17 @@ def is_empty(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def is_empty(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def is_geometry(geometry: Geometry, **kwargs) -> np.bool_[Literal[True]]: ... +def is_geometry(geometry: Geometry, **kwargs) -> _NPTrue: ... +@overload +def is_geometry(geometry: None, **kwargs) -> _NPFalse: ... @overload def is_geometry(geometry: ArrayLikeSeq[Any], **kwargs) -> NDArray[np.bool_]: ... # type: ignore[overload-overlap] @overload def is_geometry(geometry: object, **kwargs) -> TypeGuard[BaseGeometry]: ... @overload -def is_missing(geometry: Geometry, **kwargs) -> np.bool_[Literal[False]]: ... +def is_missing(geometry: Geometry, **kwargs) -> _NPFalse: ... +@overload +def is_missing(geometry: None, **kwargs) -> _NPTrue: ... @overload def is_missing(geometry: ArrayLikeSeq[Any], **kwargs) -> NDArray[np.bool_]: ... # type: ignore[overload-overlap] @overload @@ -79,7 +91,7 @@ def is_prepared(geometry: Geometry | None, **kwargs) -> np.bool_: ... @overload def is_prepared(geometry: OptGeoArrayLikeSeq, **kwargs) -> NDArray[np.bool_]: ... @overload -def is_valid_input(geometry: Geometry | None, **kwargs) -> np.bool_[Literal[True]]: ... +def is_valid_input(geometry: Geometry | None, **kwargs) -> _NPTrue: ... @overload def is_valid_input(geometry: ArrayLikeSeq[Any], **kwargs) -> NDArray[np.bool_]: ... # type: ignore[overload-overlap] @overload