@@ -71,7 +71,7 @@ class MatchStatementChecker(BaseChecker):
7171 "can be avoided." ,
7272 ),
7373 "R1906" : (
74- "Use keyword attributes instead of positional ones" ,
74+ "Use keyword attributes instead of positional ones (%s) " ,
7575 "match-class-positional-attributes" ,
7676 "Keyword attributes are more explicit and slightly faster "
7777 "since CPython can skip the `__match_args__` lookup." ,
@@ -184,22 +184,6 @@ def visit_matchclass(self, node: nodes.MatchClass) -> None:
184184 attrs : set [str ] = set ()
185185 dups : set [str ] = set ()
186186
187- if node .patterns :
188- if isinstance (node , nodes .MatchClass ) and isinstance (node .cls , nodes .Name ):
189- inferred = safe_infer (node .cls )
190- if not (
191- isinstance (inferred , nodes .ClassDef )
192- and (
193- inferred .qname () in MATCH_CLASS_SELF_NAMES
194- or "tuple" in inferred .basenames
195- )
196- ):
197- self .add_message (
198- "match-class-positional-attributes" ,
199- node = node ,
200- confidence = INFERENCE ,
201- )
202-
203187 if (
204188 node .patterns
205189 and (match_args := self .get_match_args_for_class (node .cls )) is not None
@@ -213,6 +197,22 @@ def visit_matchclass(self, node: nodes.MatchClass) -> None:
213197 )
214198 return
215199
200+ inferred = safe_infer (node .cls )
201+ if not (
202+ isinstance (inferred , nodes .ClassDef )
203+ and (
204+ inferred .qname () in MATCH_CLASS_SELF_NAMES
205+ or "tuple" in inferred .basenames
206+ )
207+ ):
208+ attributes = [f"'{ attr } '" for attr in match_args [: len (node .patterns )]]
209+ self .add_message (
210+ "match-class-positional-attributes" ,
211+ node = node ,
212+ args = (", " .join (attributes ),),
213+ confidence = INFERENCE ,
214+ )
215+
216216 for i in range (len (node .patterns )):
217217 name = match_args [i ]
218218 self .check_duplicate_sub_patterns (name , node , attrs = attrs , dups = dups )
0 commit comments