Skip to content

Commit 4203d87

Browse files
Fix a false negative for duplicate-argument-name (#9670)
* 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 <[email protected]>
1 parent d60ba59 commit 4203d87

File tree

8 files changed

+34
-21
lines changed

8 files changed

+34
-21
lines changed

doc/user_guide/checkers/features.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Basic checker Messages
6565
methods and is instantiated.
6666
:star-needs-assignment-target (E0114): *Can use starred expression only in assignment target*
6767
Emitted when a star expression is not used in an assignment target.
68-
:duplicate-argument-name (E0108): *Duplicate argument name %s in function definition*
68+
:duplicate-argument-name (E0108): *Duplicate argument name %r in function definition*
6969
Duplicate argument names in function definitions are syntax errors.
7070
:return-in-init (E0101): *Explicit return in __init__*
7171
Used when the special class method __init__ has an explicit return value.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix a false negative for ``duplicate-argument-name`` by including ``positional-only``, ``*args`` and ``**kwargs`` arguments in the check.
2+
3+
Closes #9669

pylint/checkers/base/basic_error_checker.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
from __future__ import annotations
88

99
import itertools
10-
from collections.abc import Iterator
11-
from typing import Any
1210

1311
import astroid
1412
from astroid import nodes
@@ -145,7 +143,7 @@ class BasicErrorChecker(_BasicChecker):
145143
"pre-decrement operator -- and ++, which doesn't exist in Python.",
146144
),
147145
"E0108": (
148-
"Duplicate argument name %s in function definition",
146+
"Duplicate argument name %r in function definition",
149147
"duplicate-argument-name",
150148
"Duplicate argument names in function definitions are syntax errors.",
151149
),
@@ -285,8 +283,7 @@ def visit_functiondef(self, node: nodes.FunctionDef) -> None:
285283
self.add_message("return-in-init", node=node)
286284
# Check for duplicate names by clustering args with same name for detailed report
287285
arg_clusters = {}
288-
arguments: Iterator[Any] = filter(None, [node.args.args, node.args.kwonlyargs])
289-
for arg in itertools.chain.from_iterable(arguments):
286+
for arg in node.args.arguments:
290287
if arg.name in arg_clusters:
291288
self.add_message(
292289
"duplicate-argument-name",

tests/functional/a/async_functions.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ too-many-arguments:26:0:26:26:complex_function:Too many arguments (10/5):UNDEFIN
55
too-many-branches:26:0:26:26:complex_function:Too many branches (13/12):UNDEFINED
66
too-many-return-statements:26:0:26:26:complex_function:Too many return statements (10/6):UNDEFINED
77
dangerous-default-value:59:0:59:14:func:Dangerous default value [] as argument:UNDEFINED
8-
duplicate-argument-name:59:18:59:19:func:Duplicate argument name a in function definition:HIGH
8+
duplicate-argument-name:59:18:59:19:func:Duplicate argument name 'a' in function definition:HIGH
99
disallowed-name:64:0:64:13:foo:"Disallowed name ""foo""":HIGH
1010
empty-docstring:64:0:64:13:foo:Empty function docstring:HIGH
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,28 @@
11
"""Check for duplicate function arguments."""
22

3+
# pylint: disable=missing-docstring, line-too-long, unused-argument
4+
35

46
def foo1(_, _): # [duplicate-argument-name]
5-
"""Function with duplicate argument name."""
7+
...
68

79
def foo2(_abc, *, _abc): # [duplicate-argument-name]
8-
"""Function with duplicate argument name."""
10+
...
911

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

1315
def foo4(_, *, _): # [duplicate-argument-name]
14-
"""Function with duplicate argument name."""
16+
...
17+
18+
def foo5(_, *_, _=3): # [duplicate-argument-name, duplicate-argument-name]
19+
...
20+
21+
def foo6(a, *a): # [duplicate-argument-name]
22+
...
23+
24+
def foo7(a, /, a): # [duplicate-argument-name]
25+
...
26+
27+
def foo8(a, **a): # [duplicate-argument-name]
28+
...
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
duplicate-argument-name:4:12:4:13:foo1:Duplicate argument name _ in function definition:HIGH
2-
duplicate-argument-name:7:18:7:22:foo2:Duplicate argument name _abc in function definition:HIGH
3-
duplicate-argument-name:10:12:10:13:foo3:Duplicate argument name _ in function definition:HIGH
4-
duplicate-argument-name:13:15:13:16:foo4:Duplicate argument name _ in function definition:HIGH
1+
duplicate-argument-name:6:12:6:13:foo1:Duplicate argument name '_' in function definition:HIGH
2+
duplicate-argument-name:9:18:9:22:foo2:Duplicate argument name '_abc' in function definition:HIGH
3+
duplicate-argument-name:12:12:12:13:foo3:Duplicate argument name '_' in function definition:HIGH
4+
duplicate-argument-name:15:15:15:16:foo4:Duplicate argument name '_' in function definition:HIGH
5+
duplicate-argument-name:18:13:18:14:foo5:Duplicate argument name '_' in function definition:HIGH
6+
duplicate-argument-name:18:16:18:17:foo5:Duplicate argument name '_' in function definition:HIGH
7+
duplicate-argument-name:21:13:21:14:foo6:Duplicate argument name 'a' in function definition:HIGH
8+
duplicate-argument-name:24:15:24:16:foo7:Duplicate argument name 'a' in function definition:HIGH
9+
duplicate-argument-name:27:14:27:15:foo8:Duplicate argument name 'a' in function definition:HIGH

tests/functional/d/duplicate/duplicate_argument_name_py3.py

-5
This file was deleted.

tests/functional/d/duplicate/duplicate_argument_name_py3.txt

-1
This file was deleted.

0 commit comments

Comments
 (0)