That's way better syntax!  Great idea!

On Aug 2, 2011, at 2:31 AM, Massimo Di Pierro wrote:

> We need to work on the speed. This can perhaps help the syntax:
> 
> db=DAL()
> db.define_table('a',Field('b','integer'))
> for i in range(10):
>    db.a.insert(b=i)
> 
> def lazy(f):
>    def g(self,f=f):
>        import copy
>        self=copy.copy(self)
>        return lambda *a,**b: f(self,*a,**b)
>    return g
> 
> class Scale:
>    @lazy
>    def c(self,scale=1):
>        return self.a.b*scale
> 
> db.a.virtualfields.append(Scale())
> for row in db(db.a).select():
>    print row.b, row.c(1), row.c(2), row.c(3)
> 
> 
> 
> On Aug 1, 3:10 pm, Michael Toomim <too...@gmail.com> wrote:
>> Maybe it helps for me to explain my use-case. I mainly use virtual fields as 
>> lazy methods, to help traverse related tables. I was actually surprised that 
>> lazy evaluation wasn't the default. I noticed a few implications of this:
>>   - Large queries are slowed by virtualfields, even if they won't be needed, 
>> esp if they query db
>>   - My definitions for virtualfields aren't as clean as they could be, 
>> because I have many nested "lazy" funcs in the class definition
>>   - We can't serialize all objects into session variables
>> 
>> So really I'm just using this because it's a nicer notation to call 
>> row.otherthing() instead of getotherthing(row). Maybe I really want some 
>> different feature here?
>> 
>> On Aug 1, 2011, at 5:40 AM, Anthony Bastardi wrote:
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>>> Note, after looking at this some more, Massimo recalled that the reason 
>>> auth_user virtual fields were excluded from auth.user (and therefore from 
>>> saving in the session) is because some virtual fields are objects that 
>>> cannot be pickled and therefore cannot be serialized to store in the 
>>> session. So, we're thinking of either creating an option to store auth_user 
>>> virutual fields in auth.user, or maybe testing to make sure the virtual 
>>> fields can be pickled, and excluding them if not.
>> 
>>> Anthony
>> 
>>> On Mon, Aug 1, 2011 at 5:30 AM, Michael Toomim <too...@cs.washington.edu> 
>>> wrote:
>>> Awesome! I did not know there was an issue submission system.
>> 
>>> On Jul 30, 2011, at 7:02 AM, Anthony wrote:
>> 
>>>> An issue has been submitted, and this should be corrected soon.
>> 
>>>> Anthony
>> 
>>>> On Friday, July 29, 2011 9:57:30 PM UTC-4, Anthony wrote:
>>>> auth.user is Storage(table_user._filter_fields(user, id=True)). The 
>>>> _filter_fields method of the auth_user table only selects actual table 
>>>> fields, not virtual fields, so auth.user will not include any virtual 
>>>> fields. Perhaps this should be changed.
>> 
>>>> Anthony
>> 
>>>> On Friday, July 29, 2011 9:05:39 PM UTC-4, Michael Toomim wrote:
>>>> I think I found a bug in virtualfields. I have the following
>>>> controller:
>> 
>>>> def posts():
>>>>     user = session.auth.user
>>>>     n = user.name # returns None
>> 
>>>> Where "person" is defined as a virtualfield on user:
>> 
>>>> class Users():
>>>>     def name(self):
>>>>         return self.users.first_name + ' ' + self.users.last_name
>>>> db.users.virtualfields.append(Users())
>> 
>>>> The problem is that user.name returns None, because apparently the
>>>> virtualfield isn't loaded into the session variable of user.
>> 
>>>> I made this work with the following modification to the controller:
>> 
>>>> def posts():
>>>>     user = db.users[session.auth.user.id]
>>>>     n = user.name # returns the user name correctly!
>> 
>>>> I just had to refetch the user from the database.

Reply via email to