@@ -71,7 +71,7 @@ class MatchStatementChecker(BaseChecker):
71
71
"can be avoided." ,
72
72
),
73
73
"R1906" : (
74
- "Use keyword attributes instead of positional ones" ,
74
+ "Use keyword attributes instead of positional ones (%s) " ,
75
75
"match-class-positional-attributes" ,
76
76
"Keyword attributes are more explicit and slightly faster "
77
77
"since CPython can skip the `__match_args__` lookup." ,
@@ -184,22 +184,6 @@ def visit_matchclass(self, node: nodes.MatchClass) -> None:
184
184
attrs : set [str ] = set ()
185
185
dups : set [str ] = set ()
186
186
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
-
203
187
if (
204
188
node .patterns
205
189
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:
213
197
)
214
198
return
215
199
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
+
216
216
for i in range (len (node .patterns )):
217
217
name = match_args [i ]
218
218
self .check_duplicate_sub_patterns (name , node , attrs = attrs , dups = dups )
0 commit comments