def test_callable_with_args(self): ast = self._load_ast("a", """ from typing import Callable x = ... # type: Callable[[int, bool], str] """) x = ast.Lookup("a.x").type cls = self._vm.convert.constant_to_value(x, {}, self._vm.root_cfg_node) instance = self._vm.convert.constant_to_value( abstract_utils.AsInstance(x), {}, self._vm.root_cfg_node) self.assertIsInstance(cls, abstract.CallableClass) six.assertCountEqual( self, cls.formal_type_parameters.items(), [(0, self._vm.convert.int_type), (1, self._vm.convert.primitive_classes[bool]), (abstract_utils.ARGS, abstract.Union( [cls.formal_type_parameters[0], cls.formal_type_parameters[1]], self._vm)), (abstract_utils.RET, self._vm.convert.str_type)]) self.assertIsInstance(instance, abstract.Instance) self.assertEqual(instance.cls, cls) six.assertCountEqual( self, [(name, set(var.data)) for name, var in instance.instance_type_parameters.items()], [(abstract_utils.full_type_name(instance, abstract_utils.ARGS), {self._vm.convert.primitive_class_instances[int], self._vm.convert.primitive_class_instances[bool]}), (abstract_utils.full_type_name(instance, abstract_utils.RET), {self._vm.convert.primitive_class_instances[str]})])
def test_plain_callable(self): ast = self._load_ast("a", """ from typing import Callable x = ... # type: Callable[..., int] """) x = ast.Lookup("a.x").type cls = self._vm.convert.constant_to_value(x, {}, self._vm.root_cfg_node) instance = self._vm.convert.constant_to_value( abstract_utils.AsInstance(x), {}, self._vm.root_cfg_node) self.assertIsInstance(cls, abstract.ParameterizedClass) six.assertCountEqual(self, cls.formal_type_parameters.items(), [(abstract_utils.ARGS, self._vm.convert.unsolvable), (abstract_utils.RET, self._vm.convert.int_type)]) self.assertIsInstance(instance, abstract.Instance) self.assertEqual(instance.cls, cls.base_cls) six.assertCountEqual( self, [(name, var.data) for name, var in instance.instance_type_parameters.items()], [(abstract_utils.full_type_name(instance, abstract_utils.ARGS), [self._vm.convert.unsolvable]), (abstract_utils.full_type_name(instance, abstract_utils.RET), [self._vm.convert.primitive_class_instances[int]])])