Exemple #1
0
    def getattr(self, name, context=None):
        """this method doesn't look in the instance_attrs dictionary since it's
        done by an Instance proxy at inference time.

        It may return a YES object if the attribute has not been actually
        found but a __getattr__ or __getattribute__ method is defined
        """
        values = self.locals.get(name, [])
        if name in self.special_attributes:
            if name == '__module__':
                return [cf(self.root().qname())] + values
            # FIXME: do we really need the actual list of ancestors?
            # returning [Tuple()] + values don't break any test
            # this is ticket http://www.logilab.org/ticket/52785
            # XXX need proper meta class handling + MRO implementation
            if name == '__bases__' or (name == '__mro__' and self.newstyle):
                node = Tuple()
                node.items = self.ancestors(recurs=True, context=context)
                return [node] + values
            return std_special_attributes(self, name)
        # don't modify the list in self.locals!
        values = list(values)
        for classnode in self.ancestors(recurs=True, context=context):
            values += classnode.locals.get(name, [])
        if not values:
            raise NotFoundError(name)
        return values
Exemple #2
0
    def getattr(self, name, context=None):
        """this method doesn't look in the instance_attrs dictionary since it's
        done by an Instance proxy at inference time.

        It may return a YES object if the attribute has not been actually
        found but a __getattr__ or __getattribute__ method is defined
        """
        values = self.locals.get(name, [])
        if name in self.special_attributes:
            if name == '__module__':
                return [cf(self.root().qname())] + values
            # FIXME : what is expected by passing the list of ancestors to cf:
            # you can just do [cf(tuple())] + values without breaking any test
            # this is ticket http://www.logilab.org/ticket/52785
            if name == '__bases__':
                return [cf(tuple(self.ancestors(recurs=False, context=context)))] + values
            # XXX need proper meta class handling + MRO implementation
            if name == '__mro__' and self.newstyle:
                # XXX mro is read-only but that's not our job to detect that
                return [cf(tuple(self.ancestors(recurs=True, context=context)))] + values
            return std_special_attributes(self, name)
        # don't modify the list in self.locals!
        values = list(values)
        for classnode in self.ancestors(recurs=True, context=context):
            values += classnode.locals.get(name, [])
        if not values:
            raise NotFoundError(name)
        return values
Exemple #3
0
 def getattr(self, name, context=None):
     if name in self.special_attributes:
         if name == '__file__':
             return [cf(self.file)] + self.locals.get(name, [])
         if name == '__path__' and self.package:
             return [List()] + self.locals.get(name, [])
         return std_special_attributes(self, name)
     if name in self.locals:
         return self.locals[name]
     if self.package:
         try:
             return [self.import_module(name, relative_only=True)]
         except ASTNGBuildingException:
             raise NotFoundError(name)
         except Exception:# XXX pylint tests never pass here; do we need it?
             import traceback
             traceback.print_exc()
     raise NotFoundError(name)
Exemple #4
0
 def real_name(self, asname):
     """get name from 'as' name"""
     for name, _asname in self.names:
         if name == '*':
             return asname
         if not _asname:
             name = name.split('.', 1)[0]
             _asname = name
         if asname == _asname:
             return name
     raise NotFoundError(asname)
Exemple #5
0
def std_special_attributes(self, name, add_locals=True):
    if add_locals:
        locals = self.locals
    else:
        locals = {}
    if name == '__name__':
        return [cf(self.name)] + locals.get(name, [])
    if name == '__doc__':
        return [cf(self.doc)] + locals.get(name, [])
    if name == '__dict__':
        return [Dict()] + locals.get(name, [])
    raise NotFoundError(name)
Exemple #6
0
    def instance_attr(self, name, context=None):
        """return the astng nodes associated to name in this class instance
        attributes dictionary and in its parents

        :raises `NotFoundError`:
          if no attribute with this name has been find in this class or
          its parent classes
        """
        values = self.instance_attrs.get(name, [])
        # get if from the first parent implementing it if any
        for class_node in self.instance_attr_ancestors(name, context):
            values += class_node.instance_attrs[name]
        if not values:
            raise NotFoundError(name)
        return values
Exemple #7
0
    def local_attr(self, name, context=None):
        """return the list of assign node associated to name in this class
        locals or in its parents

        :raises `NotFoundError`:
          if no attribute with this name has been find in this class or
          its parent classes
        """
        try:
            return self.locals[name]
        except KeyError:
            # get if from the first parent implementing it if any
            for class_node in self.local_attr_ancestors(name, context):
                return class_node.locals[name]
        raise NotFoundError(name)
Exemple #8
0
 def getattr(self, name, context=None, lookupclass=True):
     try:
         values = self._proxied.instance_attr(name, context)
     except NotFoundError:
         if name == '__class__':
             return [self._proxied]
         if lookupclass:
             # class attributes not available through the instance
             # unless they are explicitly defined
             if name in ('__name__', '__bases__', '__mro__',
                         '__subclasses__'):
                 return self._proxied.local_attr(name)
             return self._proxied.getattr(name, context)
         raise NotFoundError(name)
     # since we've no context information, return matching class members as
     # well
     if lookupclass:
         try:
             return values + self._proxied.getattr(name, context)
         except NotFoundError:
             pass
     return values
Exemple #9
0
 def wrapper(*args, **kwargs):
     nodes = [n for n in func(*args, **kwargs) if not isinstance(n, cls)]
     if not nodes:
         raise NotFoundError()
     return nodes