OK got it. Lambda functions dont save their scope. Here is the right code:
list = ["a","b","c","d"] fields = [] for entry in list: fields += [Field(entry, type="string")] db.define_table('test', *fields) class MyVirtualFields(object): pass def get_func(value): def func(self): return getattr(self.test, value) return fun for entry in list: setattr(MyVirtualFields, entry +"_", get_func(entry)) db.test.virtualfields.append(MyVirtualFields())