Strange. My example from earlier does not work. It returns always the last call from func.
list = ["a","b","c","d"] fields = [] for entry in list: fields += [Field(entry, type="string")] db.define_table('test', *fields) class MyVirtualFields(object): pass for entry in list: def func(self): return getattr(self.test, entry) setattr(MyVirtualFields, entry + "_virtual", func) db.test.virtualfields.append(MyVirtualFields()) so the virtual fields a_, b_, c_ and d_ are always of the value of the field d. this does also not work(same result): for entry in list: setattr(MyVirtualFields, entry + "_virtual", lambda self: getattr(self.test, entry)) db.test.virtualfields.append(MyVirtualFields()) nor does this (same result): funcs = [] for i in range(len(list)): funcs += [lambda self: getattr(self.test, list[i])] for i in range(len(list)): setattr(MyVirtualFields, entry + "_virtual", funcs[i]) db.test.virtualfields.append(MyVirtualFields()) but strangely this works: funcs = [lambda self: getattr(self.test, list[0]), lambda self: getattr(self.test, list[1]), lambda self: getattr(self.test, list[2]), lambda self: getattr(self.test, list[3]), ] for i in range(len(list)): setattr(MyVirtualFields, entry + "_virtual", funcs[i]) db.test.virtualfields.append(MyVirtualFields()) what the hell is the difference between: funcs = [lambda self: getattr(self.test, list[0]), lambda self: getattr(self.test, list[1]), lambda self: getattr(self.test, list[2]), lambda self: getattr(self.test, list[3]), ] and funcs = [] for i in range(len(list)): funcs += [lambda self: getattr(self.test, list[i])] I just dont get it.