Skip to content

Commit

Permalink
Fix false positive for keyword-arg-before-vararg (#8571) (#8578)
Browse files Browse the repository at this point in the history
* 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]>
  • Loading branch information
github-actions[bot] and mbyrnepr2 committed Apr 15, 2023
1 parent 16fe498 commit ec96bdc
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 1 deletion.
3 changes: 3 additions & 0 deletions doc/whatsnew/fragments/8570.false_positive
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix false positive for ``keyword-arg-before-vararg`` when a positional-only parameter with a default value precedes ``*args``.

Closes #8570
8 changes: 7 additions & 1 deletion pylint/checkers/typecheck.py
Original file line number Diff line number Diff line change
Expand Up @@ -1001,8 +1001,14 @@ def _compiled_generated_members(self) -> tuple[Pattern[str], ...]:

@only_required_for_messages("keyword-arg-before-vararg")
def visit_functiondef(self, node: nodes.FunctionDef) -> None:
# check for keyword arg before varargs
# check for keyword arg before varargs.

if node.args.vararg and node.args.defaults:
# When `positional-only` parameters are present then only
# `positional-or-keyword` parameters are checked. I.e:
# >>> def name(pos_only_params, /, pos_or_keyword_params, *args): ...
if node.args.posonlyargs and not node.args.args:
return
self.add_message("keyword-arg-before-vararg", node=node, args=(node.name))

visit_asyncfunctiondef = visit_functiondef
Expand Down
13 changes: 13 additions & 0 deletions tests/functional/k/keyword_arg_before_vararg_positional_only.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"""Test `keyword-arg-before-vararg` in the context of positional-only parameters"""

# pylint: disable=missing-function-docstring, unused-argument


def name1(param1, /, param2=True, *args): ... # [keyword-arg-before-vararg]
def name2(param1=True, /, param2=True, *args): ... # [keyword-arg-before-vararg]
def name3(param1, param2=True, /, param3=True, *args): ... # [keyword-arg-before-vararg]
def name4(param1, /, *args): ...
def name5(param1=True, /, *args): ...
def name6(param1, /, *args, param2=True): ...
def name7(param1=True, /, *args, param2=True): ...
def name8(param1, param2=True, /, *args, param3=True): ...
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[testoptions]
min_pyver=3.8
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
keyword-arg-before-vararg:6:0:6:9:name1:Keyword argument before variable positional arguments list in the definition of name1 function:UNDEFINED
keyword-arg-before-vararg:7:0:7:9:name2:Keyword argument before variable positional arguments list in the definition of name2 function:UNDEFINED
keyword-arg-before-vararg:8:0:8:9:name3:Keyword argument before variable positional arguments list in the definition of name3 function:UNDEFINED

0 comments on commit ec96bdc

Please sign in to comment.