@@ -60,6 +60,7 @@ class TypeVarVariance(Enum):
60
60
covariant = auto ()
61
61
contravariant = auto ()
62
62
double_variant = auto ()
63
+ inferred = auto ()
63
64
64
65
65
66
def _get_properties (config : argparse .Namespace ) -> tuple [set [str ], set [str ]]:
@@ -623,6 +624,7 @@ def _assigns_typealias(node: nodes.NodeNG | None) -> bool:
623
624
624
625
def _check_typevar (self , name : str , node : nodes .AssignName ) -> None :
625
626
"""Check for TypeVar lint violations."""
627
+ variance : TypeVarVariance = TypeVarVariance .invariant
626
628
if isinstance (node .parent , nodes .Assign ):
627
629
keywords = node .assign_type ().value .keywords
628
630
args = node .assign_type ().value .args
@@ -634,8 +636,8 @@ def _check_typevar(self, name: str, node: nodes.AssignName) -> None:
634
636
else : # PEP 695 generic type nodes
635
637
keywords = ()
636
638
args = ()
639
+ variance = TypeVarVariance .inferred
637
640
638
- variance = TypeVarVariance .invariant
639
641
name_arg = None
640
642
for kw in keywords :
641
643
if variance == TypeVarVariance .double_variant :
@@ -659,7 +661,12 @@ def _check_typevar(self, name: str, node: nodes.AssignName) -> None:
659
661
if name_arg is None and args and isinstance (args [0 ], nodes .Const ):
660
662
name_arg = args [0 ].value
661
663
662
- if variance == TypeVarVariance .double_variant :
664
+ if variance == TypeVarVariance .inferred :
665
+ # Ignore variance check for PEP 695 type parameters.
666
+ # The variance is inferred by the type checker.
667
+ # Adding _co or _contra suffix can help to reason about TypeVar.
668
+ pass
669
+ elif variance == TypeVarVariance .double_variant :
663
670
self .add_message (
664
671
"typevar-double-variance" ,
665
672
node = node ,
0 commit comments