def getObjectForProxy(self, proxy): """ Returns the unproxied version of C{proxy} as stored in the context, or unproxies the proxy and returns that 'raw' object. @see: L{pyamf.flex.unproxy_object} @since: 0.6 """ obj = self.proxied_objects.get(id(proxy)) if obj is None: from pyamf import flex obj = flex.unproxy_object(proxy) self.addProxyObject(obj, proxy) return obj
def getDecodableAttributes(self, obj, attrs, codec=None): """ Returns a dictionary of attributes for C{obj} that has been filtered, based on the supplied C{attrs}. This allows for fine grain control over what will finally end up on the object or not .. @param obj: The reference object. @param attrs: The attrs dictionary that has been decoded. @param codec: An optional argument that will contain the codec instance calling this function. @return: A dictionary of attributes that can be applied to C{obj} @since: 0.5 """ if not self._compiled: self.compile() changed = False props = set(attrs.keys()) if self.static_attrs: missing_attrs = [] for p in self.static_attrs: if p not in props: missing_attrs.append(p) if missing_attrs: raise AttributeError('Static attributes %r expected ' 'when decoding %r' % (missing_attrs, self.klass)) if not self.dynamic: if not self.decodable_properties: props = set() else: props.intersection_update(self.decodable_properties) changed = True if self.readonly_attrs: props.difference_update(self.readonly_attrs) changed = True if self.exclude_attrs: props.difference_update(self.exclude_attrs) changed = True if self.proxy_attrs is not None: from pyamf import flex for k in self.proxy_attrs: try: v = attrs[k] except KeyError: continue attrs[k] = flex.unproxy_object(v) if not changed: return attrs a = {} [a.__setitem__(p, attrs[p]) for p in props] return a