OK try: db=DAL() db.define_table('x',Field('number','integer')) if db(db.x).isempty(): [db.x.insert(number=i) for i in range(10)]
from gluon.dal import lazy_virtualfield class MyVirtualFields(object): # normal virtual field def normal_shift(self): return self.x.number+1 # lazy virtual field (because of @staticmethod) @lazy_virtualfield def lazy_shift(self,row,delta=4): return row.x.number+delta db.x.virtualfields.append(MyVirtualFields()) for row in db(db.x).select(): print row.number, row.normal_shift, row.lazy_shift(8) It is better? We have one new API and one import. I do not like so much the try of adding a __lazy__ attribute to the function because, in the future the function may be a class with a __call__ method and te decorator would mess up class attributes.... perhaps we should this dicusssion and tests on web2py-delevelopers Massimo On Aug 20, 6:46 am, Massimo Di Pierro <massimo.dipie...@gmail.com> wrote: > Yes but if we use lazy we have to define and import it from somewhere. > There is another reason. Using staticmethod we can also do > > class A(): pass > a=A() > > a.f=lambda(instance,row,*a,**b): return 'lazy value' > a.g=lambda(instance,row,*a,**b): return 'lazy value' > a.h=lambda(instance,row,*a,**b): return 'lazy value' > > db.table.virtualfields.append(a) > > Lat me give it a try anyway... > > On Aug 20, 5:51 am, Bruno Rocha <rochacbr...@gmail.com> wrote: > > > > > > > > > why static_method is used to define this? not better to have some @lazy > > decorator?