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.

Reply via email to