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.