32
32
Comparator = Callable [["Version" , Comparable ], bool ]
33
33
34
34
T = TypeVar ("T" , bound = "Version" )
35
+ T_cmp = TypeVar ("T_cmp" , tuple , str , int )
35
36
36
37
37
38
def _comparator (operator : Comparator ) -> Comparator :
@@ -53,7 +54,7 @@ def wrapper(self: "Version", other: Comparable) -> bool:
53
54
return wrapper
54
55
55
56
56
- def _cmp (a , b ): # TODO: type hints
57
+ def _cmp (a : T_cmp , b : T_cmp ) -> int :
57
58
"""Return negative if a<b, zero if a==b, positive if a>b."""
58
59
return (a > b ) - (a < b )
59
60
@@ -137,7 +138,7 @@ def __init__(
137
138
self ._build = None if build is None else str (build )
138
139
139
140
@classmethod
140
- def _nat_cmp (cls , a , b ): # TODO: type hints
141
+ def _nat_cmp (cls , a : Optional [ str ] , b : Optional [ str ]) -> int :
141
142
def cmp_prerelease_tag (a , b ):
142
143
if isinstance (a , int ) and isinstance (b , int ):
143
144
return _cmp (a , b )
@@ -150,9 +151,10 @@ def cmp_prerelease_tag(a, b):
150
151
151
152
a , b = a or "" , b or ""
152
153
a_parts , b_parts = a .split ("." ), b .split ("." )
153
- a_parts = [int (x ) if re .match (r"^\d+$" , x ) else x for x in a_parts ]
154
- b_parts = [int (x ) if re .match (r"^\d+$" , x ) else x for x in b_parts ]
155
- for sub_a , sub_b in zip (a_parts , b_parts ):
154
+ re_digits = re .compile (r"^\d+$" )
155
+ parts_a = [int (x ) if re_digits .match (x ) else x for x in a_parts ]
156
+ parts_b = [int (x ) if re_digits .match (x ) else x for x in b_parts ]
157
+ for sub_a , sub_b in zip (parts_a , parts_b ):
156
158
cmp_result = cmp_prerelease_tag (sub_a , sub_b )
157
159
if cmp_result != 0 :
158
160
return cmp_result
0 commit comments