Skip to content

Commit ba6519d

Browse files
committed
Add Matches.
1 parent b67b696 commit ba6519d

File tree

3 files changed

+108
-0
lines changed

3 files changed

+108
-0
lines changed

tests/test_type_eval.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
IsSub,
3434
Iter,
3535
Length,
36+
Matches,
3637
Member,
3738
Members,
3839
NewProtocol,
@@ -902,6 +903,99 @@ def test_never_is():
902903
assert d == _LiteralGeneric[True]
903904

904905

906+
def test_matches_01():
907+
d = eval_typing(Matches[int, int])
908+
assert d == _LiteralGeneric[True]
909+
910+
d = eval_typing(Matches[int, str])
911+
assert d == _LiteralGeneric[False]
912+
913+
d = eval_typing(Matches[str, int])
914+
assert d == _LiteralGeneric[False]
915+
916+
917+
def test_matches_02():
918+
class A:
919+
pass
920+
921+
class B(A):
922+
pass
923+
924+
class C(B):
925+
pass
926+
927+
class D(A):
928+
pass
929+
930+
class X:
931+
pass
932+
933+
d = eval_typing(Matches[A, A])
934+
assert d == _LiteralGeneric[True]
935+
936+
d = eval_typing(Matches[A, B])
937+
assert d == _LiteralGeneric[False]
938+
d = eval_typing(Matches[B, A])
939+
assert d == _LiteralGeneric[False]
940+
d = eval_typing(Matches[B, C])
941+
assert d == _LiteralGeneric[False]
942+
d = eval_typing(Matches[C, B])
943+
assert d == _LiteralGeneric[False]
944+
d = eval_typing(Matches[C, D])
945+
assert d == _LiteralGeneric[False]
946+
d = eval_typing(Matches[D, C])
947+
assert d == _LiteralGeneric[False]
948+
949+
d = eval_typing(Matches[A, X])
950+
assert d == _LiteralGeneric[False]
951+
952+
953+
def test_matches_03():
954+
class A[T]:
955+
pass
956+
957+
class B[T](A[T]):
958+
pass
959+
960+
class C(B[int]):
961+
pass
962+
963+
class D(A[str]):
964+
pass
965+
966+
class X:
967+
pass
968+
969+
d = eval_typing(Matches[A[int], A[int]])
970+
assert d == _LiteralGeneric[True]
971+
d = eval_typing(Matches[A[int], A[str]])
972+
assert d == _LiteralGeneric[True]
973+
974+
d = eval_typing(Matches[A[int], B[int]])
975+
assert d == _LiteralGeneric[False]
976+
d = eval_typing(Matches[B[int], A[int]])
977+
assert d == _LiteralGeneric[False]
978+
d = eval_typing(Matches[A[int], B[str]])
979+
assert d == _LiteralGeneric[False]
980+
d = eval_typing(Matches[B[str], A[int]])
981+
assert d == _LiteralGeneric[False]
982+
d = eval_typing(Matches[B[int], C])
983+
assert d == _LiteralGeneric[False]
984+
d = eval_typing(Matches[C, B[int]])
985+
assert d == _LiteralGeneric[False]
986+
d = eval_typing(Matches[B[str], C])
987+
assert d == _LiteralGeneric[False]
988+
d = eval_typing(Matches[C, B[str]])
989+
assert d == _LiteralGeneric[False]
990+
d = eval_typing(Matches[C, D])
991+
assert d == _LiteralGeneric[False]
992+
d = eval_typing(Matches[D, C])
993+
assert d == _LiteralGeneric[False]
994+
995+
d = eval_typing(Matches[A[int], X])
996+
assert d == _LiteralGeneric[False]
997+
998+
905999
def test_eval_iter_01():
9061000
d = eval_typing(Iter[tuple[int, str]])
9071001
assert tuple(d) == (int, str)

typemap/type_eval/_eval_operators.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
Iter,
3636
Length,
3737
Lowercase,
38+
Matches,
3839
Member,
3940
Members,
4041
NewProtocol,
@@ -246,6 +247,14 @@ def _eval_IsSubSimilar(lhs, rhs, *, ctx):
246247
return _LiteralGeneric[type_eval.issubsimilar(lhs, rhs)]
247248

248249

250+
@type_eval.register_evaluator(Matches)
251+
@_lift_evaluated
252+
def _eval_Matches(lhs, rhs, *, ctx):
253+
return _LiteralGeneric[
254+
type_eval.issubsimilar(lhs, rhs) and type_eval.issubsimilar(rhs, lhs)
255+
]
256+
257+
249258
def _eval_bool_tp(tp):
250259
if _typing_inspect.is_generic_alias(tp):
251260
if tp.__origin__ is typing.Literal:

typemap/typing.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,11 @@ def IsSubSimilar(self, tps):
196196
return _BoolGenericAlias(self, tps)
197197

198198

199+
@_SpecialForm
200+
def Matches(self, tps):
201+
return _BoolGenericAlias(self, tps)
202+
203+
199204
IsSub = IsSubSimilar
200205

201206

0 commit comments

Comments
 (0)