diff options
Diffstat (limited to 'pylint/checkers/classes.py')
-rw-r--r-- | pylint/checkers/classes.py | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/pylint/checkers/classes.py b/pylint/checkers/classes.py index 847e3ea58..c0b827bb8 100644 --- a/pylint/checkers/classes.py +++ b/pylint/checkers/classes.py @@ -60,6 +60,10 @@ def _different_parameters(original, overridden): * they have different positional parameters, including different names + * one of the methods is having variadics, while the other is not + + * they have different keyword only parameters. + """ original_parameters = _positional_parameters(original) @@ -67,12 +71,18 @@ def _different_parameters(original, overridden): different_positional = _has_different_parameters(original_parameters, overridden_parameters) - - if different_positional: - # If the second method is using positional variadic arguments, then it is okay - # to not complain about it. - different_positional = overridden.args.vararg is None - return different_positional + different_kwonly = _has_different_parameters(original.args.kwonlyargs, + overridden.args.kwonlyargs) + + # Both or none should have extra variadics, otherwise the method + # loses or gains capabilities that are not reflected into the parent method, + # leading to potential inconsistencies in the code. + different_kwarg = sum(1 for param in (original.args.kwarg, overridden.args.kwarg) + if not param) == 1 + different_vararg = sum(1 for param in (original.args.vararg, overridden.args.vararg) + if not param) == 1 + + return different_positional or different_kwarg or different_vararg or different_kwonly def _is_invalid_base_class(cls): |