summaryrefslogtreecommitdiff
path: root/astroid
diff options
context:
space:
mode:
authorStanislav Levin <slev@altlinux.org>2019-12-22 23:08:47 +0300
committerClaudiu Popa <pcmanticore@gmail.com>2019-12-23 15:23:57 +0100
commitc54af820fcbaa1dd7a4644670b58a40b4f587ff9 (patch)
treeb3be93ceed60d9abe02c0ca7aa3e2135d4a995d6 /astroid
parent1cce2085b06b2147d7da3fdfa53e578cd3278146 (diff)
downloadastroid-git-c54af820fcbaa1dd7a4644670b58a40b4f587ff9.tar.gz
Make use of cache while transform builtin containers
As of now, the transformation of builtin containers which members, in turn, are containers relies on `safe_infer` helper. `safe_infer` tries to infer the node to get its values. Doing this without a cache containing a previously inferred nodes lead to infinite recursion, for example, on resolving a class attribute. Note: this doesn't help to infer a class attribute by itself is such a case, but prevents crash. Closes: https://github.com/PyCQA/pylint/issues/3245 Signed-off-by: Stanislav Levin <slev@altlinux.org>
Diffstat (limited to 'astroid')
-rw-r--r--astroid/brain/brain_builtin_inference.py9
1 files changed, 6 insertions, 3 deletions
diff --git a/astroid/brain/brain_builtin_inference.py b/astroid/brain/brain_builtin_inference.py
index 7cc6095f..3cbe48f7 100644
--- a/astroid/brain/brain_builtin_inference.py
+++ b/astroid/brain/brain_builtin_inference.py
@@ -154,7 +154,7 @@ def _container_generic_inference(node, context, node_type, transform):
if len(node.args) > 1:
raise UseInferenceDefault()
- arg, = args
+ (arg,) = args
transformed = transform(arg)
if not transformed:
try:
@@ -169,7 +169,7 @@ def _container_generic_inference(node, context, node_type, transform):
return transformed
-def _container_generic_transform(arg, klass, iterables, build_elts):
+def _container_generic_transform(arg, context, klass, iterables, build_elts):
if isinstance(arg, klass):
return arg
elif isinstance(arg, iterables):
@@ -177,7 +177,9 @@ def _container_generic_transform(arg, klass, iterables, build_elts):
elts = [elt.value for elt in arg.elts]
else:
# TODO: Does not handle deduplication for sets.
- elts = filter(None, map(helpers.safe_infer, arg.elts))
+ elts = filter(
+ None, map(partial(helpers.safe_infer, context=context), arg.elts)
+ )
elif isinstance(arg, nodes.Dict):
# Dicts need to have consts as strings already.
if not all(isinstance(elt[0], nodes.Const) for elt in arg.items):
@@ -197,6 +199,7 @@ def _infer_builtin_container(
):
transform_func = partial(
_container_generic_transform,
+ context=context,
klass=klass,
iterables=iterables,
build_elts=build_elts,