def _load_late_type(self, late_type): """Resolve a late type, possibly by loading a module.""" if late_type.name not in self._resolved_late_types: module, dot, _ = late_type.name.rpartition(".") assert dot ast = self.vm.loader.import_name(module) if ast is not None: try: # TODO(kramm): Should this use pytd.py:ToType? cls = ast.Lookup(late_type.name) except KeyError: try: ast.Lookup("__getattr__") except KeyError: log.warning("Couldn't resolve %s", late_type.name) t = pytd.AnythingType() else: t = pytd.ToType(cls, allow_constants=False) else: # A pickle file refers to a module that went away in the mean time. log.error("During dependency resolution, couldn't import %r", module) t = pytd.AnythingType() self._resolved_late_types[late_type.name] = t return self._resolved_late_types[late_type.name]
def _load_late_type(self, late_type): """Resolve a late type, possibly by loading a module.""" if late_type.name not in self._resolved_late_types: ast = self.ctx.loader.import_name(late_type.name) if ast: t = pytd.Module(name=late_type.name, module_name=late_type.name) else: ast, attr_name = self._load_late_type_module(late_type) if ast is None: log.error( "During dependency resolution, couldn't resolve late type %r", late_type.name) t = pytd.AnythingType() else: try: cls = pytd.LookupItemRecursive(ast, attr_name) except KeyError: if "__getattr__" not in ast: log.warning("Couldn't resolve %s", late_type.name) t = pytd.AnythingType() else: t = pytd.ToType(cls, allow_functions=True) self._resolved_late_types[late_type.name] = t return self._resolved_late_types[late_type.name]
def not_supported_yet(name, ctx, ast=None): ast = ast or ctx.loader.typing full_name = f"{ast.name}.{name}" ctx.errorlog.not_supported_yet(ctx.vm.frames, full_name) pytd_type = pytd.ToType(ast.Lookup(full_name), True, True, True) return ctx.convert.constant_to_value(pytd_type, node=ctx.root_node)