summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudiu Popa <pcmanticore@gmail.com>2019-04-03 11:22:27 +0200
committerClaudiu Popa <pcmanticore@gmail.com>2019-04-03 11:22:27 +0200
commitc8db761f5fbe7535115639d578cd46c350d25b47 (patch)
tree07b8029be216f17899a5456572831a2458a8cea1
parentb4721fb339c4f4f0b4e39a9d0cb3223b523ac0b2 (diff)
downloadpylint-git-c8db761f5fbe7535115639d578cd46c350d25b47.tar.gz
Handle more `unnecessary-lambda` cases when dealing with additional kwargs in wrapped calls
Close #2845
-rw-r--r--ChangeLog4
-rw-r--r--pylint/checkers/base.py14
-rw-r--r--pylint/test/functional/unnecessary_lambda.py2
3 files changed, 18 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index c41108a83..0634fe387 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 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)