diff options
author | Claudiu Popa <pcmanticore@gmail.com> | 2019-04-03 11:22:27 +0200 |
---|---|---|
committer | Claudiu Popa <pcmanticore@gmail.com> | 2019-04-03 11:22:27 +0200 |
commit | c8db761f5fbe7535115639d578cd46c350d25b47 (patch) | |
tree | 07b8029be216f17899a5456572831a2458a8cea1 | |
parent | b4721fb339c4f4f0b4e39a9d0cb3223b523ac0b2 (diff) | |
download | pylint-git-c8db761f5fbe7535115639d578cd46c350d25b47.tar.gz |
Handle more `unnecessary-lambda` cases when dealing with additional kwargs in wrapped calls
Close #2845
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | pylint/checkers/base.py | 14 | ||||
-rw-r--r-- | pylint/test/functional/unnecessary_lambda.py | 2 |
3 files changed, 18 insertions, 2 deletions
@@ -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 16dd824c2..64ca43f6f 100644 --- a/pylint/checkers/base.py +++ b/pylint/checkers/base.py @@ -47,6 +47,7 @@ from typing import Pattern 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 @@ class BasicChecker(_BasicChecker): # 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 @@ class BasicChecker(_BasicChecker): 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 461710919..f0bd775f3 100644 --- a/pylint/test/functional/unnecessary_lambda.py +++ b/pylint/test/functional/unnecessary_lambda.py @@ -49,3 +49,5 @@ _ = lambda: _ANYARGS(func=42) # Don't warn about this.
_ = lambda: code().analysis()
+
+_ = lambda **kwargs: dict(bar=42, **kwargs)
|