def pop(self, key, *args): try: o = self.data.pop(key)() except KeyError: o = None if o is None: if args: return args[0] raise KeyError, key else: return o def setdefault(self, key, default=None): try: o = self.data[key]() except KeyError: o = None if o is None: self.data[key] = KeyedRef(default, self._remove, key) return default else: return o