class FileMetadataWrapper(object): """ Wraps a CDMS file object to track provenance of variables """ def __init__(self, source): self.source = source self.vars = WeakList() def __call__(self, *args, **kwargs): # Retrieve a transient variable from source var = self.source(*args, **kwargs) v = VariableMetadataWrapper(var, self, args, kwargs, operation=self.__call__) self.vars.append(v) return v def __getitem__(self, *args): var = self.source.__getitem__(*args) v = VariableMetadataWrapper(var, self, args, operation=self.__getitem__) self.vars.append(v) return v def __getattribute__(self, name): if name not in ("source", "vars"): s = super(FileMetadataWrapper, self).__getattribute__("source") return getattr(s, name) else: return super(FileMetadataWrapper, self).__getattribute__(name) def __setattr__(self, name, value): if name in ("source", "vars"): super(FileMetadataWrapper, self).__setattr__(name, value) return setattr(self.source, name, value)
def __init__(self, source): self.source = source self.vars = WeakList()