Skip to content

Commit

Permalink
Fix a false negative for duplicate-argument-name (#9670)
Browse files Browse the repository at this point in the history
* Fix a false negative for ``duplicate-argument-name`` by including ``positional-only``, ``*args`` and ``**kwargs`` arguments in the check.

Closes #9669

Co-authored-by: Pierre Sassoulas <pierre.sassoulas@gmail.com>
  • Loading branch information
mbyrnepr2 and Pierre-Sassoulas committed Jun 3, 2024
1 parent d60ba59 commit 4203d87
Show file tree
Hide file tree
Showing 8 changed files with 34 additions and 21 deletions.
2 changes: 1 addition & 1 deletion doc/user_guide/checkers/features.rst
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ Basic checker Messages
methods and is instantiated.
:star-needs-assignment-target (E0114): *Can use starred expression only in assignment target*
Emitted when a star expression is not used in an assignment target.
:duplicate-argument-name (E0108): *Duplicate argument name %s in function definition*
:duplicate-argument-name (E0108): *Duplicate argument name %r in function definition*
Duplicate argument names in function definitions are syntax errors.
:return-in-init (E0101): *Explicit return in __init__*
Used when the special class method __init__ has an explicit return value.
Expand Down
3 changes: 3 additions & 0 deletions doc/whatsnew/fragments/9669.false_negative
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix a false negative for ``duplicate-argument-name`` by including ``positional-only``, ``*args`` and ``**kwargs`` arguments in the check.

Closes #9669
7 changes: 2 additions & 5 deletions pylint/checkers/base/basic_error_checker.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
from __future__ import annotations

import itertools
from collections.abc import Iterator
from typing import Any

import astroid
from astroid import nodes
Expand Down Expand Up @@ -145,7 +143,7 @@ class BasicErrorChecker(_BasicChecker):
"pre-decrement operator -- and ++, which doesn't exist in Python.",
),
"E0108": (
"Duplicate argument name %s in function definition",
"Duplicate argument name %r in function definition",
"duplicate-argument-name",
"Duplicate argument names in function definitions are syntax errors.",
),
Expand Down Expand Up @@ -285,8 +283,7 @@ def visit_functiondef(self, node: nodes.FunctionDef) -> None:
self.add_message("return-in-init", node=node)
# Check for duplicate names by clustering args with same name for detailed report
arg_clusters = {}
arguments: Iterator[Any] = filter(None, [node.args.args, node.args.kwonlyargs])
for arg in itertools.chain.from_iterable(arguments):
for arg in node.args.arguments:
if arg.name in arg_clusters:
self.add_message(
"duplicate-argument-name",
Expand Down
2 changes: 1 addition & 1 deletion tests/functional/a/async_functions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ too-many-arguments:26:0:26:26:complex_function:Too many arguments (10/5):UNDEFIN
too-many-branches:26:0:26:26:complex_function:Too many branches (13/12):UNDEFINED
too-many-return-statements:26:0:26:26:complex_function:Too many return statements (10/6):UNDEFINED
dangerous-default-value:59:0:59:14:func:Dangerous default value [] as argument:UNDEFINED
duplicate-argument-name:59:18:59:19:func:Duplicate argument name a in function definition:HIGH
duplicate-argument-name:59:18:59:19:func:Duplicate argument name 'a' in function definition:HIGH
disallowed-name:64:0:64:13:foo:"Disallowed name ""foo""":HIGH
empty-docstring:64:0:64:13:foo:Empty function docstring:HIGH
22 changes: 18 additions & 4 deletions tests/functional/d/duplicate/duplicate_argument_name.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,28 @@
"""Check for duplicate function arguments."""

# pylint: disable=missing-docstring, line-too-long, unused-argument


def foo1(_, _): # [duplicate-argument-name]
"""Function with duplicate argument name."""
...

def foo2(_abc, *, _abc): # [duplicate-argument-name]
"""Function with duplicate argument name."""
...

def foo3(_, _=3): # [duplicate-argument-name]
"""Function with duplicate argument name."""
...

def foo4(_, *, _): # [duplicate-argument-name]
"""Function with duplicate argument name."""
...

def foo5(_, *_, _=3): # [duplicate-argument-name, duplicate-argument-name]
...

def foo6(a, *a): # [duplicate-argument-name]
...

def foo7(a, /, a): # [duplicate-argument-name]
...

def foo8(a, **a): # [duplicate-argument-name]
...
13 changes: 9 additions & 4 deletions tests/functional/d/duplicate/duplicate_argument_name.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
duplicate-argument-name:4:12:4:13:foo1:Duplicate argument name _ in function definition:HIGH
duplicate-argument-name:7:18:7:22:foo2:Duplicate argument name _abc in function definition:HIGH
duplicate-argument-name:10:12:10:13:foo3:Duplicate argument name _ in function definition:HIGH
duplicate-argument-name:13:15:13:16:foo4:Duplicate argument name _ in function definition:HIGH
duplicate-argument-name:6:12:6:13:foo1:Duplicate argument name '_' in function definition:HIGH
duplicate-argument-name:9:18:9:22:foo2:Duplicate argument name '_abc' in function definition:HIGH
duplicate-argument-name:12:12:12:13:foo3:Duplicate argument name '_' in function definition:HIGH
duplicate-argument-name:15:15:15:16:foo4:Duplicate argument name '_' in function definition:HIGH
duplicate-argument-name:18:13:18:14:foo5:Duplicate argument name '_' in function definition:HIGH
duplicate-argument-name:18:16:18:17:foo5:Duplicate argument name '_' in function definition:HIGH
duplicate-argument-name:21:13:21:14:foo6:Duplicate argument name 'a' in function definition:HIGH
duplicate-argument-name:24:15:24:16:foo7:Duplicate argument name 'a' in function definition:HIGH
duplicate-argument-name:27:14:27:15:foo8:Duplicate argument name 'a' in function definition:HIGH
5 changes: 0 additions & 5 deletions tests/functional/d/duplicate/duplicate_argument_name_py3.py

This file was deleted.

This file was deleted.

0 comments on commit 4203d87

Please sign in to comment.