def __init__(self, vm): super().__init__(vm) self.vm.convert = self # to make constant_to_value calls below work self.pytd_convert = output.Converter(vm) self._convert_cache = {} self._resolved_late_types = {} # performance cache # Initialize primitive_classes to empty to allow constant_to_value to run. self.primitive_classes = () # object_type is needed to initialize the primitive class values. self.object_type = self.constant_to_value(object) if self.vm.PY2: version_specific = [compat.UnicodeType] else: version_specific = [compat.BytesType] self.unsolvable = abstract.Unsolvable(self.vm) self.empty = abstract.Empty(self.vm) self.no_return = typing_overlay.NoReturn(self.vm) # Now fill primitive_classes with the real values using constant_to_value. primitive_classes = [ int, float, str, object, frozenset, compat.NoneType, complex, bool, slice, types.CodeType, compat.EllipsisType, compat.OldStyleClassType, super ] + version_specific self.primitive_classes = { v: self.constant_to_value(v) for v in primitive_classes } self.primitive_class_names = [ self._type_to_name(x) for x in self.primitive_classes ] self.none = abstract.AbstractOrConcreteValue( None, self.primitive_classes[compat.NoneType], self.vm) self.true = abstract.AbstractOrConcreteValue( True, self.primitive_classes[bool], self.vm) self.false = abstract.AbstractOrConcreteValue( False, self.primitive_classes[bool], self.vm) self.ellipsis = abstract.AbstractOrConcreteValue( Ellipsis, self.primitive_classes[compat.EllipsisType], self.vm) self.primitive_class_instances = {} for name, cls in self.primitive_classes.items(): if name == compat.NoneType: # This is possible because all None instances are the same. # Without it pytype could not reason that "x is None" is always true, if # x is indeed None. instance = self.none elif name == compat.EllipsisType: instance = self.ellipsis else: instance = abstract.Instance(cls, self.vm) self.primitive_class_instances[name] = instance self._convert_cache[(abstract.Instance, cls.pytd_cls)] = instance self.none_type = self.primitive_classes[compat.NoneType] self.oldstyleclass_type = self.primitive_classes[ compat.OldStyleClassType] self.super_type = self.primitive_classes[super] self.str_type = self.primitive_classes[str] self.int_type = self.primitive_classes[int] self.list_type = self.constant_to_value(list) self.set_type = self.constant_to_value(set) self.frozenset_type = self.constant_to_value(frozenset) self.dict_type = self.constant_to_value(dict) self.type_type = self.constant_to_value(type) self.module_type = self.constant_to_value(types.ModuleType) self.function_type = self.constant_to_value(types.FunctionType) self.tuple_type = self.constant_to_value(tuple) self.generator_type = self.constant_to_value(types.GeneratorType) self.iterator_type = self.constant_to_value(compat.IteratorType) if self.vm.python_version >= (3, 5): self.coroutine_type = self.constant_to_value(compat.CoroutineType) self.awaitable_type = self.constant_to_value(compat.AwaitableType) if self.vm.python_version >= (3, 6): self.async_generator_type = self.constant_to_value( compat.AsyncGeneratorType) self.bool_values = { True: self.true, False: self.false, None: self.primitive_class_instances[bool], } if self.vm.PY2: self.unicode_type = self.primitive_classes[compat.UnicodeType] self.bytes_type = self.str_type self.next_attr = "next" else: self.unicode_type = self.str_type self.bytes_type = self.primitive_classes[compat.BytesType] self.next_attr = "__next__"
def __init__(self, ctx): super().__init__(ctx) ctx.convert = self # to make constant_to_value calls below work self._convert_cache = {} self._resolved_late_types = {} # performance cache # Initialize primitive_classes to empty to allow constant_to_value to run. self.primitive_classes = () # object_type is needed to initialize the primitive class values. self.object_type = self.constant_to_value(object) self.unsolvable = abstract.Unsolvable(self.ctx) self.type_type = self.constant_to_value(type) self.ctx.converter_minimally_initialized = True self.empty = abstract.Empty(self.ctx) self.no_return = typing_overlay.NoReturn(self.ctx) # Now fill primitive_classes with the real values using constant_to_value. primitive_classes = [ int, float, str, bytes, object, NoneType, complex, bool, slice, types.CodeType, EllipsisType, super, ] self.primitive_classes = { v: self.constant_to_value(v) for v in primitive_classes } self.primitive_class_names = [ self._type_to_name(x) for x in self.primitive_classes] self.none = abstract.ConcreteValue(None, self.primitive_classes[NoneType], self.ctx) self.true = abstract.ConcreteValue(True, self.primitive_classes[bool], self.ctx) self.false = abstract.ConcreteValue(False, self.primitive_classes[bool], self.ctx) self.ellipsis = abstract.ConcreteValue(Ellipsis, self.primitive_classes[EllipsisType], self.ctx) self.primitive_class_instances = {} for name, cls in self.primitive_classes.items(): if name == NoneType: # This is possible because all None instances are the same. # Without it pytype could not reason that "x is None" is always true, if # x is indeed None. instance = self.none elif name == EllipsisType: instance = self.ellipsis else: instance = abstract.Instance(cls, self.ctx) self.primitive_class_instances[name] = instance self._convert_cache[(abstract.Instance, cls.pytd_cls)] = instance self.none_type = self.primitive_classes[NoneType] self.super_type = self.primitive_classes[super] self.str_type = self.primitive_classes[str] self.int_type = self.primitive_classes[int] self.bool_type = self.primitive_classes[bool] self.bytes_type = self.primitive_classes[bytes] self.list_type = self.constant_to_value(list) self.set_type = self.constant_to_value(set) self.frozenset_type = self.constant_to_value(frozenset) self.dict_type = self.constant_to_value(dict) self.module_type = self.constant_to_value(types.ModuleType) self.function_type = self.constant_to_value(types.FunctionType) self.tuple_type = self.constant_to_value(tuple) self.generator_type = self.constant_to_value(types.GeneratorType) self.iterator_type = self.constant_to_value(IteratorType) self.coroutine_type = self.constant_to_value(CoroutineType) self.awaitable_type = self.constant_to_value(AwaitableType) self.async_generator_type = self.constant_to_value(AsyncGeneratorType) self.bool_values = { True: self.true, False: self.false, None: self.primitive_class_instances[bool], }