@@ -60,6 +60,7 @@ class TypeVarVariance(Enum):
6060 covariant = auto ()
6161 contravariant = auto ()
6262 double_variant = auto ()
63+ inferred = auto ()
6364
6465
6566def _get_properties (config : argparse .Namespace ) -> tuple [set [str ], set [str ]]:
@@ -623,6 +624,7 @@ def _assigns_typealias(node: nodes.NodeNG | None) -> bool:
623624
624625 def _check_typevar (self , name : str , node : nodes .AssignName ) -> None :
625626 """Check for TypeVar lint violations."""
627+ variance : TypeVarVariance = TypeVarVariance .invariant
626628 if isinstance (node .parent , nodes .Assign ):
627629 keywords = node .assign_type ().value .keywords
628630 args = node .assign_type ().value .args
@@ -634,8 +636,8 @@ def _check_typevar(self, name: str, node: nodes.AssignName) -> None:
634636 else : # PEP 695 generic type nodes
635637 keywords = ()
636638 args = ()
639+ variance = TypeVarVariance .inferred
637640
638- variance = TypeVarVariance .invariant
639641 name_arg = None
640642 for kw in keywords :
641643 if variance == TypeVarVariance .double_variant :
@@ -659,7 +661,12 @@ def _check_typevar(self, name: str, node: nodes.AssignName) -> None:
659661 if name_arg is None and args and isinstance (args [0 ], nodes .Const ):
660662 name_arg = args [0 ].value
661663
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 :
663670 self .add_message (
664671 "typevar-double-variance" ,
665672 node = node ,
0 commit comments