summaryrefslogtreecommitdiff
path: root/natsort/natsort.py
diff options
context:
space:
mode:
Diffstat (limited to 'natsort/natsort.py')
-rw-r--r--natsort/natsort.py83
1 files changed, 46 insertions, 37 deletions
diff --git a/natsort/natsort.py b/natsort/natsort.py
index 1dcf9ce..c5136dd 100644
--- a/natsort/natsort.py
+++ b/natsort/natsort.py
@@ -18,7 +18,6 @@ from typing import (
Optional,
Sequence,
Tuple,
- TypeVar,
Union,
cast,
overload,
@@ -28,25 +27,19 @@ import natsort.compat.locale
from natsort import utils
from natsort.compat.locale import StrOrBytes
from natsort.ns_enum import NS_DUMB, NS_t, ns
-from natsort.utils import KeyType, NatsortInType, NatsortOutType, PathArg
-
-# Some generic types
-T_ns = TypeVar("T_ns", bound=NatsortInType)
-T_path = TypeVar("T_path", bound=PathArg)
-T_any = TypeVar("T_any")
+from natsort.utils import KeyType, MaybeKeyType, NatsortInType, NatsortOutType, PathArg
# Keys that natsort accepts
-MaybeKeyType = Optional[KeyType]
PathKeyType = Callable[[Any_t], PathArg]
MaybePathKeyType = Optional[PathKeyType]
# Common input and output types
-Iter_ns = Iterable[T_ns]
-Iter_any = Iterable[T_any]
-Iter_path = Iterable[T_path]
-List_ns = List[T_ns]
-List_any = List[T_any]
-List_path = List[T_path]
+Iter_ns = Iterable[NatsortInType]
+Iter_any = Iterable[Any_t]
+Iter_path = Iterable[PathArg]
+List_ns = List[NatsortInType]
+List_any = List[Any_t]
+List_path = List[PathArg]
List_int = List[int]
# The type that natsort_key returns
@@ -144,7 +137,7 @@ def as_utf8(s: NatsortInType) -> NatsortInType:
return utils.do_decoding(s, "utf-8")
-def natsort_keygen(key=MaybeKeyType, alg: NS_t = ns.DEFAULT) -> NatsortKeyType:
+def natsort_keygen(key: MaybeKeyType = None, alg: NS_t = ns.DEFAULT) -> NatsortKeyType:
"""
Generate a key to sort strings and numbers naturally.
@@ -260,17 +253,17 @@ def natsorted(seq: Iter_ns) -> List_ns:
@overload
-def natsorted(seq: Iter_ns, reverse: bool) -> List_ns:
+def natsorted(seq: Iter_ns, *, reverse: bool) -> List_ns:
...
@overload
-def natsorted(seq: Iter_ns, alg: NS_t) -> List_ns:
+def natsorted(seq: Iter_ns, *, alg: NS_t) -> List_ns:
...
@overload
-def natsorted(seq: Iter_ns, reverse: bool, alg: NS_t) -> List_ns:
+def natsorted(seq: Iter_ns, *, reverse: bool, alg: NS_t) -> List_ns:
...
@@ -285,7 +278,7 @@ def natsorted(seq: Iter_ns, key: None, reverse: bool) -> List_ns:
@overload
-def natsorted(seq: Iter_ns, key: None, alg: NS_t) -> List_ns:
+def natsorted(seq: Iter_ns, key: None, *, alg: NS_t) -> List_ns:
...
@@ -305,7 +298,7 @@ def natsorted(seq: Iter_any, key: KeyType, reverse: bool) -> List_any:
@overload
-def natsorted(seq: Iter_any, key: KeyType, alg: NS_t) -> List_any:
+def natsorted(seq: Iter_any, key: KeyType, *, alg: NS_t) -> List_any:
...
@@ -314,7 +307,12 @@ def natsorted(seq: Iter_any, key: KeyType, reverse: bool, alg: NS_t) -> List_any
...
-def natsorted(seq, key=None, reverse=False, alg=ns.DEFAULT):
+def natsorted(
+ seq: Iter_any,
+ key: MaybeKeyType = None,
+ reverse: bool = False,
+ alg: NS_t = ns.DEFAULT,
+) -> List_any:
"""
Sorts an iterable naturally.
@@ -359,12 +357,14 @@ def natsorted(seq, key=None, reverse=False, alg=ns.DEFAULT):
['num2', 'num3', 'num5']
"""
- key = natsort_keygen(key, alg)
- return sorted(seq, reverse=reverse, key=key)
+ return sorted(seq, reverse=reverse, key=natsort_keygen(key, alg))
def humansorted(
- seq: Iter_any, key=MaybeKeyType, reverse: bool = False, alg: NS_t = ns.DEFAULT
+ seq: Iter_any,
+ key: MaybeKeyType = None,
+ reverse: bool = False,
+ alg: NS_t = ns.DEFAULT,
) -> List_any:
"""
Convenience function to properly sort non-numeric characters.
@@ -481,17 +481,17 @@ def index_natsorted(seq: Iter_ns) -> List_int:
@overload
-def index_natsorted(seq: Iter_ns, reverse: bool) -> List_int:
+def index_natsorted(seq: Iter_ns, *, reverse: bool) -> List_int:
...
@overload
-def index_natsorted(seq: Iter_ns, alg: NS_t) -> List_int:
+def index_natsorted(seq: Iter_ns, *, alg: NS_t) -> List_int:
...
@overload
-def index_natsorted(seq: Iter_ns, reverse: bool, alg: NS_t) -> List_int:
+def index_natsorted(seq: Iter_ns, *, reverse: bool, alg: NS_t) -> List_int:
...
@@ -506,7 +506,7 @@ def index_natsorted(seq: Iter_ns, key: None, reverse: bool) -> List_int:
@overload
-def index_natsorted(seq: Iter_ns, key: None, alg: NS_t) -> List_int:
+def index_natsorted(seq: Iter_ns, key: None, *, alg: NS_t) -> List_int:
...
@@ -526,7 +526,7 @@ def index_natsorted(seq: Iter_any, key: KeyType, reverse: bool) -> List_int:
@overload
-def index_natsorted(seq: Iter_any, key: KeyType, alg: NS_t) -> List_int:
+def index_natsorted(seq: Iter_any, key: KeyType, *, alg: NS_t) -> List_int:
...
@@ -535,7 +535,12 @@ def index_natsorted(seq: Iter_any, key: KeyType, reverse: bool, alg: NS_t) -> Li
...
-def index_natsorted(seq, key=None, reverse=False, alg=ns.DEFAULT):
+def index_natsorted(
+ seq: Iter_any,
+ key: MaybeKeyType = None,
+ reverse: bool = False,
+ alg: NS_t = ns.DEFAULT,
+) -> List_int:
"""
Determine the list of the indexes used to sort the input sequence.
@@ -592,12 +597,12 @@ def index_natsorted(seq, key=None, reverse=False, alg=ns.DEFAULT):
"""
newkey: KeyType
- if key is None:
+ if key is not None:
newkey = itemgetter(1)
else:
- def newkey(x):
- return key(itemgetter(1)(x))
+ def newkey(x: Any_t) -> NatsortInType:
+ return cast(KeyType, key)(itemgetter(1)(x))
# Pair the index and sequence together, then sort by element
index_seq_pair = [(x, y) for x, y in enumerate(seq)]
@@ -711,7 +716,7 @@ def index_realsorted(
# noinspection PyShadowingBuiltins,PyUnresolvedReferences
def order_by_index(
- seq: Sequence[T_any], index: Iterable[int], iter: bool = False
+ seq: Sequence[Any_t], index: Iterable[int], iter: bool = False
) -> Iter_any:
"""
Order a given sequence by an index sequence.
@@ -830,7 +835,9 @@ else:
except ImportError:
# No ICU installed
def os_sort_keygen(key: MaybePathKeyType = None) -> OSSortKeyType:
- return natsort_keygen(key=key, alg=ns.LOCALE | ns.PATH | ns.IGNORECASE)
+ return natsort_keygen(
+ key=cast(MaybeKeyType, key), alg=ns.LOCALE | ns.PATH | ns.IGNORECASE
+ )
else:
# ICU installed
@@ -887,7 +894,7 @@ def os_sorted(seq: Iter_path) -> List_path:
@overload
-def os_sorted(seq: Iter_path, reverse: bool) -> List_path:
+def os_sorted(seq: Iter_path, *, reverse: bool) -> List_path:
...
@@ -911,7 +918,9 @@ def os_sorted(seq: Iter_any, key: PathKeyType, reverse: bool) -> List_any:
...
-def os_sorted(seq, key=None, reverse=False):
+def os_sorted(
+ seq: Iter_any, key: MaybePathKeyType = None, reverse: bool = False
+) -> List_any:
"""
Sort elements in the same order as your operating system's file browser