On Friday, February 7, 2014 8:25:10 AM UTC+9, C Anthony Risinger wrote:
>
> On Wed, Feb 5, 2014 at 3:50 PM, Clavier <[email protected]
> <javascript:>>wrote:
>
>> Hi.
>>
>> I am trying to see whether I can implement __getattr__() which is called
>> when a method does not exist. I have to use a very long unreadable call in
>> the current version of Pyjs:
>>
>> server=WebRpc('http://server.com/')
>> server.request(arg1, arg2) #
>> Python call
>> server.__getattr__('request').__call__(arg1, arg2) # Pyjs call
>> because __getattr__() is not automatically called
>>
>> I made a class (WebRpc) that a client can access server-side objects, and
>> this makes client-server programming very simple. In this case, supporting
>> __getattr__() is important because it makes a server-client call exactly
>> like a local call. The current Pyjs doesn't support it, so I have to call
>> it explicitly making the code unreadable.
>>
>> I found a previous discussion about it (
>> https://groups.google.com/forum/#!topic/pyjamas-dev/_aJ2nmFjjas), but I
>> don't understand why it has a performance issue. I think that a programmer
>> can avoid it by directly calling the method (i.e.
>> "obj.__getattr__('request').call()" instead of "obj.request()") if
>> performance is an issue.
>>
>> Please give me your advice about it (how to implement, caveats, or
>> performance issues, etc).
>>
>
> are you building with --enable-accessor-proto? that discussion is from
> 2009.
>
> this code:
>
> =========================
> class Hi(object):
>
> def __getattr__(self, key):
> print(key)
>
> hi = Hi()
> print(hi.there)
> =========================
>
> ...will print 'there' and 'null' to the console.
>
> --
>
> C Anthony
>
Your example(member referencing: hi.there) worked with and
without --enable-accessor-proto. But my application including method calls
(i.e. hi.there()) building with --enable-accessor-proto still didn't work.
I think that the current Pyjs throws an error on a method call(hi.there()),
but not on member reference (hi.there) regardless of the option.
Following is the simplified code I tested:
#######################
# test __getattr__()
class Hi2():
def __init__(self, name):
self.name=name
def __call__(self):
print 'Hi2.%s() was called'% (self.name)
class Hi(object):
def __getattr__(self, key):
print 'in Hi.__getattr__(%s)' % key
return Hi2(key)
hi = Hi()
hi.there #member reference
hi.there() #method call
Python result :
in Hi.__getattr__(there)
in Hi.__getattr__(there)
Hi2.there() was called
Pyjs result (IE and FireFox):
in Hi.__getattr__(there)
Unknown exception: [object Error]
Traceback:
test_getattr.py, line 17:
hi.there()
As you can see, member reference(hi.there) worked, but method call
(hi.there()) threw an exception.
--
---
You received this message because you are subscribed to the Google Groups
"Pyjs.org Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.