Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions doc/whatsnew/fragments/8675.false_negative
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix a false positive for `too-many-arguments` in (non static) method and classmethod.

Closes #8675
16 changes: 12 additions & 4 deletions pylint/checkers/design_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -561,20 +561,28 @@
ignored_args_num = ignored_pos_args_num + ignored_kwonly_args_num

argnum = len(args) - ignored_args_num
if argnum > self.linter.config.max_args:
if node.type in {"function", "staticmethod"}:
max_args = self.linter.config.max_args
max_positional_arguments = self.linter.config.max_positional_arguments
elif node.type in {"method", "classmethod"}:
max_args = self.linter.config.max_args + 1
max_positional_arguments = (
self.linter.config.max_positional_arguments + 1
)
if argnum > max_args:

Check failure on line 572 in pylint/checkers/design_analysis.py

View workflow job for this annotation

GitHub Actions / pylint

E0606

Possibly using variable 'max_args' before assignment
self.add_message(
"too-many-arguments",
node=node,
args=(len(args), self.linter.config.max_args),
args=(len(args), max_args),
)
pos_args_count = (
len(args) - len(node.args.kwonlyargs) - ignored_pos_args_num
)
if pos_args_count > self.linter.config.max_positional_arguments:
if pos_args_count > max_positional_arguments:

Check failure on line 581 in pylint/checkers/design_analysis.py

View workflow job for this annotation

GitHub Actions / pylint

E0606

Possibly using variable 'max_positional_arguments' before assignment
self.add_message(
"too-many-positional-arguments",
node=node,
args=(pos_args_count, self.linter.config.max_positional_arguments),
args=(pos_args_count, max_positional_arguments),
confidence=HIGH,
)
else:
Expand Down
10 changes: 5 additions & 5 deletions tests/functional/t/too/too_many_positional_arguments.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# pylint: disable=missing-function-docstring, missing-module-docstring
class FiveArgumentMethods:
"""The max positional arguments default is 5."""
def fail1(self, a, b, c, d, e): # [too-many-arguments, too-many-positional-arguments]
class SixArgumentMethods:
"""The max positional arguments default is 5, so 6 for a method because of self."""
def fail1(self, a, b, c, d, e, f): # [too-many-arguments, too-many-positional-arguments]
pass
def fail2(self, a, b, c, d, /, e): # [too-many-arguments, too-many-positional-arguments]
def fail2(self, a, b, c, d, e, /, f): # [too-many-arguments, too-many-positional-arguments]
pass
def okay1(self, a, b, c, d, *, e=True): # [too-many-arguments]
def okay1(self, a, b, c, d, e, *, f=True): # [too-many-arguments]
pass
10 changes: 5 additions & 5 deletions tests/functional/t/too/too_many_positional_arguments.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
too-many-arguments:4:4:4:13:FiveArgumentMethods.fail1:Too many arguments (6/5):UNDEFINED
too-many-positional-arguments:4:4:4:13:FiveArgumentMethods.fail1:Too many positional arguments (6/5):HIGH
too-many-arguments:6:4:6:13:FiveArgumentMethods.fail2:Too many arguments (6/5):UNDEFINED
too-many-positional-arguments:6:4:6:13:FiveArgumentMethods.fail2:Too many positional arguments (6/5):HIGH
too-many-arguments:8:4:8:13:FiveArgumentMethods.okay1:Too many arguments (6/5):UNDEFINED
too-many-arguments:4:4:4:13:SixArgumentMethods.fail1:Too many arguments (7/6):UNDEFINED
too-many-positional-arguments:4:4:4:13:SixArgumentMethods.fail1:Too many positional arguments (7/6):HIGH
too-many-arguments:6:4:6:13:SixArgumentMethods.fail2:Too many arguments (7/6):UNDEFINED
too-many-positional-arguments:6:4:6:13:SixArgumentMethods.fail2:Too many positional arguments (7/6):HIGH
too-many-arguments:8:4:8:13:SixArgumentMethods.okay1:Too many arguments (7/6):UNDEFINED
Loading