def __getattr__(self, name): attr = None if self.__cachedir__ and Atom.is_cached(self.__cachedir__, name): attr = Atom.load(self.__cachedir__, name, is_client=self.__is_client__) setattr(self, name, attr) return attr if self.__source__ is None and self.__factory__ is not None: source = self.__factory__() self.__source__ = source #Not really the right place for this. #if self.__cachedir__ is not None: # print '%s = %s' % (self.__cachedir__, len(self)) if self.__source__ is not None: attr = getattr(self.__source__, name) if attr is not None and self.__index__ is not None: #Although this is simple and effective it is not very efficienct # a = Ai(Bi(C[xy]))) #Using this method: # ax = Cx[Bi][Ai], xy = ay[Bi][Ai] #A better approach is to calculate the index then apply it # bai = Bi[Ai], ax = Cx[bai], ay = Cx[bai] attr = attr[self.__index__] if attr is not None: setattr(self, name, attr) return attr
def __init__(self, source=None, factory=None, cachedir=None, index=None, cnames=None, name=None, columns=None, is_client=True, kw={}): if cachedir and not os.path.exists(cachedir): os.makedirs(cachedir) self.__cachedir__ = cachedir self.__source__ = source self.__factory__ = factory self.__index__ = index #cnames and source.cnames def __cnames(): __cnames = None if cnames: if hasattr(cnames, '__call__'): __cnames = cnames(self) elif isinstance(cnames, str): __cnames = cnames.split(',') else: __cnames = cnames else: __cnames = [] if source is not None: __cnames += source.__cnames__ if kw: __cnames += [x for x in kw.keys() if x not in __cnames] return __cnames self.__cnames__ = __cnames() if columns is not None: for name, value in zip(self.__cnames__, columns): setattr(self, name, value) if name is None: if source is not None: name = source.__name__ else: name = 'element_%s' % id(self) self.__name__ = name self.__columns__ = columns self.__is_client__ = is_client for name, value in kw.items(): if isinstance(value, str): value = getcolumn(self, value) elif hasattr(value, '__call__'): value = value(self) if isinstance(value, list): value = Atom.fromlist(value) value = value if isinstance(value, list): value = Atom.fromlist(value) elif isinstance(value, np.ndarray) and not isinstance(value, Atom): value = Atom(value) setattr(self, name, value) if cachedir is not None: for name in self.__cnames__: if not Atom.is_cached(cachedir, name): getattr(self, name).persist(cachedir, name)