From 677eb0bae3fe99e02cae9079674c3acf8a04a10f Mon Sep 17 00:00:00 2001 From: Andy Lee Date: Thu, 7 Aug 2025 12:54:16 -0700 Subject: [PATCH] fix: Python 3.9 compatibility - replace Union type syntax - Replace 'int | None' with 'Optional[int]' everywhere - Replace 'subprocess.Popen | None' with 'Optional[subprocess.Popen]' - Add Optional import to all affected files - Update ruff target-version from py310 to py39 - The '|' syntax for Union types was introduced in Python 3.10 (PEP 604) Fixes TypeError: unsupported operand type(s) for |: 'type' and 'NoneType' --- .../leann_backend_diskann/diskann_backend.py | 4 ++-- .../leann_backend_hnsw/hnsw_backend.py | 4 ++-- packages/leann-core/src/leann/api.py | 6 +++--- .../leann-core/src/leann/embedding_server_manager.py | 5 +++-- packages/leann-core/src/leann/interface.py | 10 ++++++---- packages/leann-core/src/leann/searcher_base.py | 4 ++-- pyproject.toml | 2 +- 7 files changed, 19 insertions(+), 16 deletions(-) diff --git a/packages/leann-backend-diskann/leann_backend_diskann/diskann_backend.py b/packages/leann-backend-diskann/leann_backend_diskann/diskann_backend.py index 8c44704..0440c10 100644 --- a/packages/leann-backend-diskann/leann_backend_diskann/diskann_backend.py +++ b/packages/leann-backend-diskann/leann_backend_diskann/diskann_backend.py @@ -4,7 +4,7 @@ import os import struct import sys from pathlib import Path -from typing import Any, Literal +from typing import Any, Literal, Optional import numpy as np import psutil @@ -384,7 +384,7 @@ class DiskannSearcher(BaseSearcher): prune_ratio: float = 0.0, recompute_embeddings: bool = False, pruning_strategy: Literal["global", "local", "proportional"] = "global", - zmq_port: int | None = None, + zmq_port: Optional[int] = None, batch_recompute: bool = False, dedup_node_dis: bool = False, **kwargs, diff --git a/packages/leann-backend-hnsw/leann_backend_hnsw/hnsw_backend.py b/packages/leann-backend-hnsw/leann_backend_hnsw/hnsw_backend.py index d6b87f9..1d5f635 100644 --- a/packages/leann-backend-hnsw/leann_backend_hnsw/hnsw_backend.py +++ b/packages/leann-backend-hnsw/leann_backend_hnsw/hnsw_backend.py @@ -2,7 +2,7 @@ import logging import os import shutil from pathlib import Path -from typing import Any, Literal +from typing import Any, Literal, Optional import numpy as np from leann.interface import ( @@ -152,7 +152,7 @@ class HNSWSearcher(BaseSearcher): self, query: np.ndarray, top_k: int, - zmq_port: int | None = None, + zmq_port: Optional[int] = None, complexity: int = 64, beam_width: int = 1, prune_ratio: float = 0.0, diff --git a/packages/leann-core/src/leann/api.py b/packages/leann-core/src/leann/api.py index 74562bc..9b4d043 100644 --- a/packages/leann-core/src/leann/api.py +++ b/packages/leann-core/src/leann/api.py @@ -10,7 +10,7 @@ import time import warnings from dataclasses import dataclass, field from pathlib import Path -from typing import Any, Literal +from typing import Any, Literal, Optional import numpy as np @@ -33,7 +33,7 @@ def compute_embeddings( model_name: str, mode: str = "sentence-transformers", use_server: bool = True, - port: int | None = None, + port: Optional[int] = None, is_build=False, ) -> np.ndarray: """ @@ -175,7 +175,7 @@ class LeannBuilder: self, backend_name: str, embedding_model: str = "facebook/contriever", - dimensions: int | None = None, + dimensions: Optional[int] = None, embedding_mode: str = "sentence-transformers", **backend_kwargs, ): diff --git a/packages/leann-core/src/leann/embedding_server_manager.py b/packages/leann-core/src/leann/embedding_server_manager.py index 2e1c12b..74ecd69 100644 --- a/packages/leann-core/src/leann/embedding_server_manager.py +++ b/packages/leann-core/src/leann/embedding_server_manager.py @@ -6,6 +6,7 @@ import subprocess import sys import time from pathlib import Path +from typing import Optional import psutil @@ -182,8 +183,8 @@ class EmbeddingServerManager: e.g., "leann_backend_diskann.embedding_server" """ self.backend_module_name = backend_module_name - self.server_process: subprocess.Popen | None = None - self.server_port: int | None = None + self.server_process: Optional[subprocess.Popen] = None + self.server_port: Optional[int] = None self._atexit_registered = False def start_server( diff --git a/packages/leann-core/src/leann/interface.py b/packages/leann-core/src/leann/interface.py index d63078b..83803a0 100644 --- a/packages/leann-core/src/leann/interface.py +++ b/packages/leann-core/src/leann/interface.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Any, Literal +from typing import Any, Literal, Optional import numpy as np @@ -34,7 +34,9 @@ class LeannBackendSearcherInterface(ABC): pass @abstractmethod - def _ensure_server_running(self, passages_source_file: str, port: int | None, **kwargs) -> int: + def _ensure_server_running( + self, passages_source_file: str, port: Optional[int], **kwargs + ) -> int: """Ensure server is running""" pass @@ -48,7 +50,7 @@ class LeannBackendSearcherInterface(ABC): prune_ratio: float = 0.0, recompute_embeddings: bool = False, pruning_strategy: Literal["global", "local", "proportional"] = "global", - zmq_port: int | None = None, + zmq_port: Optional[int] = None, **kwargs, ) -> dict[str, Any]: """Search for nearest neighbors @@ -74,7 +76,7 @@ class LeannBackendSearcherInterface(ABC): self, query: str, use_server_if_available: bool = True, - zmq_port: int | None = None, + zmq_port: Optional[int] = None, ) -> np.ndarray: """Compute embedding for a query string diff --git a/packages/leann-core/src/leann/searcher_base.py b/packages/leann-core/src/leann/searcher_base.py index 02ec430..ff368c8 100644 --- a/packages/leann-core/src/leann/searcher_base.py +++ b/packages/leann-core/src/leann/searcher_base.py @@ -1,7 +1,7 @@ import json from abc import ABC, abstractmethod from pathlib import Path -from typing import Any, Literal +from typing import Any, Literal, Optional import numpy as np @@ -169,7 +169,7 @@ class BaseSearcher(LeannBackendSearcherInterface, ABC): prune_ratio: float = 0.0, recompute_embeddings: bool = False, pruning_strategy: Literal["global", "local", "proportional"] = "global", - zmq_port: int | None = None, + zmq_port: Optional[int] = None, **kwargs, ) -> dict[str, Any]: """ diff --git a/pyproject.toml b/pyproject.toml index 646ac82..ad6727d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -89,7 +89,7 @@ leann-backend-diskann = { path = "packages/leann-backend-diskann", editable = tr leann-backend-hnsw = { path = "packages/leann-backend-hnsw", editable = true } [tool.ruff] -target-version = "py310" +target-version = "py39" line-length = 100 extend-exclude = [ "third_party",