def getattr(self, w_obj, w_name): # an optional shortcut for performance w_type = self.type(w_obj) w_descr = w_type.getattribute_if_not_from_object() if w_descr is not None: return self._handle_getattribute(w_descr, w_obj, w_name) # fast path: XXX this is duplicating most of the logic # from the default __getattribute__ and the getattr() method... name = get_attribute_name(self, w_obj, w_name) w_descr = w_type.lookup(name) e = None if w_descr is not None: w_get = None is_data = self.is_data_descr(w_descr) if is_data: w_get = self.lookup(w_descr, "__get__") if w_get is None: w_value = w_obj.getdictvalue(self, name) if w_value is not None: return w_value if not is_data: w_get = self.lookup(w_descr, "__get__") typ = type(w_descr) if typ is Function or typ is FunctionWithFixedCode: # This shortcut is necessary if w_obj is None. Otherwise e.g. # None.__eq__ would return an unbound function because calling # __get__ with None as the first argument returns the attribute # as if it was accessed through the owner (type(None).__eq__). return Method(self, w_descr, w_obj) if w_get is not None: # __get__ is allowed to raise an AttributeError to trigger # use of __getattr__. try: return self.get_and_call_function(w_get, w_descr, w_obj, w_type) except OperationError as e: if not e.match(self, self.w_AttributeError): raise else: return w_descr else: w_value = w_obj.getdictvalue(self, name) if w_value is not None: return w_value w_descr = self.lookup(w_obj, '__getattr__') if w_descr is not None: return self.get_and_call_function(w_descr, w_obj, w_name) elif e is not None: raise e else: raiseattrerror(self, w_obj, w_name)
def getattr(self, w_obj, w_name): # an optional shortcut for performance w_type = self.type(w_obj) w_descr = w_type.getattribute_if_not_from_object() if w_descr is not None: return self._handle_getattribute(w_descr, w_obj, w_name) # fast path: XXX this is duplicating most of the logic # from the default __getattribute__ and the getattr() method... name = self.text_w(w_name) w_descr = w_type.lookup(name) e = None if w_descr is not None: w_get = None is_data = self.is_data_descr(w_descr) if is_data: w_get = self.lookup(w_descr, "__get__") if w_get is None: w_value = w_obj.getdictvalue(self, name) if w_value is not None: return w_value if not is_data: w_get = self.lookup(w_descr, "__get__") if w_get is not None: # __get__ is allowed to raise an AttributeError to trigger # use of __getattr__. try: return self.get_and_call_function(w_get, w_descr, w_obj, w_type) except OperationError as e: if not e.match(self, self.w_AttributeError): raise else: return w_descr else: w_value = w_obj.getdictvalue(self, name) if w_value is not None: return w_value w_descr = self.lookup(w_obj, '__getattr__') if w_descr is not None: return self.get_and_call_function(w_descr, w_obj, w_name) elif e is not None: raise e else: raiseattrerror(self, w_obj, name)
def getattr(self, w_obj, w_name): # an optional shortcut for performance w_type = self.type(w_obj) w_descr = w_type.getattribute_if_not_from_object() if w_descr is not None: return self._handle_getattribute(w_descr, w_obj, w_name) # fast path: XXX this is duplicating most of the logic # from the default __getattribute__ and the getattr() method... name = self.str_w(w_name) w_descr = w_type.lookup(name) e = None if w_descr is not None: w_get = None is_data = self.is_data_descr(w_descr) if is_data: w_get = self.lookup(w_descr, "__get__") if w_get is None: w_value = w_obj.getdictvalue(self, name) if w_value is not None: return w_value if not is_data: w_get = self.lookup(w_descr, "__get__") if w_get is not None: # __get__ is allowed to raise an AttributeError to trigger # use of __getattr__. try: return self.get_and_call_function(w_get, w_descr, w_obj, w_type) except OperationError as e: if not e.match(self, self.w_AttributeError): raise else: return w_descr else: w_value = w_obj.getdictvalue(self, name) if w_value is not None: return w_value w_descr = self.lookup(w_obj, "__getattr__") if w_descr is not None: return self.get_and_call_function(w_descr, w_obj, w_name) elif e is not None: raise e else: raiseattrerror(self, w_obj, name)
if not e.match(self, self.w_AttributeError): raise else: return w_descr else: w_value = w_obj.getdictvalue(self, name) if w_value is not None: return w_value w_descr = self.lookup(w_obj, '__getattr__') if w_descr is not None: return self.get_and_call_function(w_descr, w_obj, w_name) elif e is not None: raise e else: raiseattrerror(self, w_obj, name) def finditem_str(self, w_obj, key): """ Perform a getitem on w_obj with key (string). Returns found element or None on element not found. performance shortcut to avoid creating the OperationError(KeyError) and allocating W_BytesObject """ if (isinstance(w_obj, W_DictMultiObject) and not w_obj.user_overridden_class): return w_obj.getitem_str(key) return ObjSpace.finditem_str(self, w_obj, key) def finditem(self, w_obj, w_key): """ Perform a getitem on w_obj with w_key (any object). Returns found
return self.get(w_descr, w_obj) except OperationError, e: if not e.match(self, self.w_AttributeError): raise else: w_value = w_obj.getdictvalue(self, w_name) if w_value is not None: return w_value w_descr = self.lookup(w_obj, '__getattr__') if w_descr is not None: return self.get_and_call_function(w_descr, w_obj, w_name) elif e is not None: raise e else: raiseattrerror(self, w_obj, name) def finditem(self, w_obj, w_key): # performance shortcut to avoid creating the OperationError(KeyError) if type(w_obj) is self.DictObjectCls: return w_obj.get(w_key, None) return ObjSpace.finditem(self, w_obj, w_key) def set_str_keyed_item(self, w_obj, w_key, w_value, shadows_type=True): # performance shortcut to avoid creating the OperationError(KeyError) if type(w_obj) is self.DictObjectCls: w_obj.set_str_keyed_item(w_key, w_value, shadows_type) else: self.setitem(w_obj, w_key, w_value) def getindex_w(self, w_obj, w_exception, objdescr=None):