diff --git a/ChangeLog b/ChangeLog index c41108a838..0634fe387c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,10 @@ What's New in Pylint 2.4.0? Release date: TBA +* Handle more `unnecessary-lambda` cases when dealing with additional kwargs in wrapped calls + + Close #2845 + * Better postponed evaluation of annotations handling Close #2847 diff --git a/pylint/checkers/base.py b/pylint/checkers/base.py index 16dd824c2b..64ca43f6fb 100644 --- a/pylint/checkers/base.py +++ b/pylint/checkers/base.py @@ -47,6 +47,7 @@ import astroid import astroid.bases import astroid.scoped_nodes +from astroid.arguments import CallSite import pylint.utils as lint_utils from pylint import checkers, exceptions, interfaces @@ -1174,13 +1175,12 @@ def visit_lambda(self, node): # return something else (but we don't check that, yet). return + call_site = CallSite.from_call(call) ordinary_args = list(node.args.args) new_call_args = list(self._filter_vararg(node, call.args)) if node.args.kwarg: if self._has_variadic_argument(call.kwargs, node.args.kwarg): return - elif call.kwargs or call.keywords: - return if node.args.vararg: if self._has_variadic_argument(call.starargs, node.args.vararg): @@ -1188,6 +1188,16 @@ def visit_lambda(self, node): elif call.starargs: return + if call.keywords: + # Look for additional keyword arguments that are not part + # of the lambda's signature + lambda_kwargs = {keyword.name for keyword in node.args.defaults} + if len(lambda_kwargs) != len(call_site.keyword_arguments): + # Different lengths, so probably not identical + return + if set(call_site.keyword_arguments).difference(lambda_kwargs): + return + # The "ordinary" arguments must be in a correspondence such that: # ordinary_args[i].name == call.args[i].name. if len(ordinary_args) != len(new_call_args): diff --git a/pylint/test/functional/unnecessary_lambda.py b/pylint/test/functional/unnecessary_lambda.py index 461710919c..f0bd775f36 100644 --- a/pylint/test/functional/unnecessary_lambda.py +++ b/pylint/test/functional/unnecessary_lambda.py @@ -49,3 +49,5 @@ # Don't warn about this. _ = lambda: code().analysis() + +_ = lambda **kwargs: dict(bar=42, **kwargs)