예제 #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
            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=False, context=context):
            try:
                values += classnode.getattr(name, context)
            except NotFoundError:
                continue
        if not values:
            raise NotFoundError(name)
        return values
예제 #2
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)
예제 #3
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.
     """
     if name == '__module__':
         return [cf(self.root().qname())]
     return std_special_attributes(self, name, False)
예제 #4
0
 def getattr(self, name, context=None):
     if not name in self.special_attributes:
         try:
             return self.locals[name]
         except KeyError:
             pass
     else:
         if name == '__file__':
             return [cf(self.file)] + self.locals.get(name, [])
         if name == '__path__':
             if self.package:
                 return [List()] + self.locals.get(name, [])
         return std_special_attributes(self, name)
     if self.package:
         try:
             return [self.import_module(name, relative_only=True)]
         except (KeyboardInterrupt, SystemExit):
             raise
         except:
             pass
     raise NotFoundError(name)