Skip to content

Commit ec96bdc

Browse files
Fix false positive for keyword-arg-before-vararg (#8571) (#8578)
* Fix false positive for ``keyword-arg-before-vararg`` when a positional-only parameter with a default value precedes ``*args``. Closes #8570 (cherry picked from commit 56fa5dc) Co-authored-by: Mark Byrne <[email protected]>
1 parent 16fe498 commit ec96bdc

File tree

5 files changed

+28
-1
lines changed

5 files changed

+28
-1
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix false positive for ``keyword-arg-before-vararg`` when a positional-only parameter with a default value precedes ``*args``.
2+
3+
Closes #8570

pylint/checkers/typecheck.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1001,8 +1001,14 @@ def _compiled_generated_members(self) -> tuple[Pattern[str], ...]:
10011001

10021002
@only_required_for_messages("keyword-arg-before-vararg")
10031003
def visit_functiondef(self, node: nodes.FunctionDef) -> None:
1004-
# check for keyword arg before varargs
1004+
# check for keyword arg before varargs.
1005+
10051006
if node.args.vararg and node.args.defaults:
1007+
# When `positional-only` parameters are present then only
1008+
# `positional-or-keyword` parameters are checked. I.e:
1009+
# >>> def name(pos_only_params, /, pos_or_keyword_params, *args): ...
1010+
if node.args.posonlyargs and not node.args.args:
1011+
return
10061012
self.add_message("keyword-arg-before-vararg", node=node, args=(node.name))
10071013

10081014
visit_asyncfunctiondef = visit_functiondef
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"""Test `keyword-arg-before-vararg` in the context of positional-only parameters"""
2+
3+
# pylint: disable=missing-function-docstring, unused-argument
4+
5+
6+
def name1(param1, /, param2=True, *args): ... # [keyword-arg-before-vararg]
7+
def name2(param1=True, /, param2=True, *args): ... # [keyword-arg-before-vararg]
8+
def name3(param1, param2=True, /, param3=True, *args): ... # [keyword-arg-before-vararg]
9+
def name4(param1, /, *args): ...
10+
def name5(param1=True, /, *args): ...
11+
def name6(param1, /, *args, param2=True): ...
12+
def name7(param1=True, /, *args, param2=True): ...
13+
def name8(param1, param2=True, /, *args, param3=True): ...
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[testoptions]
2+
min_pyver=3.8
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
keyword-arg-before-vararg:6:0:6:9:name1:Keyword argument before variable positional arguments list in the definition of name1 function:UNDEFINED
2+
keyword-arg-before-vararg:7:0:7:9:name2:Keyword argument before variable positional arguments list in the definition of name2 function:UNDEFINED
3+
keyword-arg-before-vararg:8:0:8:9:name3:Keyword argument before variable positional arguments list in the definition of name3 function:UNDEFINED

0 commit comments

Comments
 (0)