Coverage for src / remedapy / prop.py: 72%
18 statements
« prev ^ index » next coverage.py v7.13.2, created at 2026-02-02 10:52 +0100
« prev ^ index » next coverage.py v7.13.2, created at 2026-02-02 10:52 +0100
1from collections.abc import Callable, Sequence
2from typing import Any, TypeVar, overload
4Key = str | int
5T = TypeVar('T')
8@overload
9def prop(data: dict[Key, T], /, key: Key) -> T | None: ...
12@overload
13def prop(data: Sequence[T], /, key: int) -> T | None: ...
16@overload
17def prop(key: str, /) -> Callable[[dict[str, T]], T | None]: ...
20@overload
21def prop(key: int, /) -> Callable[[Sequence[T]], T | None]: ...
24@overload
25def prop(data: dict[Key, Any], /, *keys: Key) -> Any | None: ...
28@overload
29def prop(data: Sequence[Any], /, *keys: int | str) -> Any | None: ...
32@overload
33def prop(*keys: int | str) -> Any | None: ...
36def prop_helper(data: Any, /, *keys: int | str) -> Any | None:
37 if len(keys) == 0:
38 return data
39 try:
40 new_data = data[keys[0]]
41 except KeyError:
42 return None
43 except IndexError:
44 return None
45 return prop_helper(new_data, *keys[1:])
48def prop(data: Any, /, *keys: int | str) -> Any | None: # pyright: ignore[reportInconsistentOverload]
49 if not isinstance(data, (dict, list, tuple)):
50 return lambda x: prop_helper(x, data, *keys) # pyright: ignore[reportUnknownVariableType, reportUnknownLambdaType]
51 return prop_helper(data, keys) # pyright: ignore[reportArgumentType]