diff --git a/astroid/brain/brain_type.py b/astroid/brain/brain_type.py index ec4cf2a46d..c6fc382b02 100644 --- a/astroid/brain/brain_type.py +++ b/astroid/brain/brain_type.py @@ -17,7 +17,7 @@ """ import sys -from astroid import MANAGER, extract_node, inference_tip, nodes +from astroid import MANAGER, UseInferenceDefault, extract_node, inference_tip, nodes PY39 = sys.version_info >= (3, 9) @@ -47,6 +47,9 @@ def infer_type_sub(node, context=None): :return: the inferred node :rtype: nodes.NodeNG """ + node_scope, _ = node.scope().lookup("type") + if node_scope.qname() != "builtins": + raise UseInferenceDefault() class_src = """ class type: def __class_getitem__(cls, key): diff --git a/tests/unittest_inference.py b/tests/unittest_inference.py index fb361f35f4..ce15e1efd1 100644 --- a/tests/unittest_inference.py +++ b/tests/unittest_inference.py @@ -3986,6 +3986,70 @@ def test(): with self.assertRaises(exceptions.AstroidTypeError): inferred.getitem(nodes.Const("4")) + def test_infer_arg_called_type_is_uninferable(self): + node = extract_node( + """ + def func(type): + type #@ + """ + ) + inferred = next(node.infer()) + assert inferred is util.Uninferable + + def test_infer_arg_called_object_when_used_as_index_is_uninferable(self): + node = extract_node( + """ + def func(object): + ['list'][ + object #@ + ] + """ + ) + inferred = next(node.infer()) + assert inferred is util.Uninferable + + @test_utils.require_version(minver="3.9") + def test_infer_arg_called_type_when_used_as_index_is_uninferable(self): + # https://github.com/PyCQA/astroid/pull/958 + node = extract_node( + """ + def func(type): + ['list'][ + type #@ + ] + """ + ) + inferred = next(node.infer()) + assert not isinstance(inferred, nodes.ClassDef) # was inferred as builtins.type + assert inferred is util.Uninferable + + @test_utils.require_version(minver="3.9") + def test_infer_arg_called_type_when_used_as_subscript_is_uninferable(self): + # https://github.com/PyCQA/astroid/pull/958 + node = extract_node( + """ + def func(type): + type[0] #@ + """ + ) + inferred = next(node.infer()) + assert not isinstance(inferred, nodes.ClassDef) # was inferred as builtins.type + assert inferred is util.Uninferable + + @test_utils.require_version(minver="3.9") + def test_infer_arg_called_type_defined_in_outer_scope_is_uninferable(self): + # https://github.com/PyCQA/astroid/pull/958 + node = extract_node( + """ + def outer(type): + def inner(): + type[0] #@ + """ + ) + inferred = next(node.infer()) + assert not isinstance(inferred, nodes.ClassDef) # was inferred as builtins.type + assert inferred is util.Uninferable + class GetattrTest(unittest.TestCase): def test_yes_when_unknown(self):