From a62330d2f13146d2996533ef1860ce74f74541d0 Mon Sep 17 00:00:00 2001 From: Karim shoair Date: Fri, 13 Feb 2026 17:30:55 +0200 Subject: [PATCH] fix: add typed overloads to Selectors.get() for proper default type inference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Type checkers now correctly infer the return type based on the default value: - .get() → TextHandler | None - .get("") → TextHandler | str - .get(0) → TextHandler | int --- scrapling/parser.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scrapling/parser.py b/scrapling/parser.py index 820bc71..c8d04af 100644 --- a/scrapling/parser.py +++ b/scrapling/parser.py @@ -23,6 +23,7 @@ from scrapling.core._types import ( List, Tuple, Union, + TypeVar, Pattern, Callable, Literal, @@ -51,6 +52,7 @@ _whitelisted = { "class_": "class", "for_": "for", } +_T = TypeVar("_T") # Pre-compiled selectors for efficiency _find_all_elements = XPath(".//*") _find_all_elements_with_spaces = XPath( @@ -1337,7 +1339,13 @@ class Selectors(List[Selector]): """ return self.__class__([element for element in self if func(element)]) - def get(self, default: Optional[TextHandler] = None) -> Union[TextHandler, None]: + @overload + def get(self) -> Optional[TextHandler]: ... + + @overload + def get(self, default: _T) -> Union[TextHandler, _T]: ... + + def get(self, default=None): """Returns the serialized string of the first element, or ``default`` if empty. :param default: the default value to return if the current list is empty """