Michael Curran schrieb:
> Hi Thomas,
> 
> The new changes to the dyndispatch branch sound great.
> 
> I'm definitely still interested in the branch, and am hoping that once 
> its stable enough that it can be merged in to trunk so I can start using 
> it properly in the NVDA project.
> 
> I havn't fully tested out all the changes you mentioned yet, but from 
> what you have written, they all sound ok to me. I'm also glad you 
> decided against any early binding, as they really would have limited 
> performance, specially if the user was not going to use a lot of the 
> methods on a particular interface.
> 
> One thing: comtypes.client.lazybind.NamedProperty. You ask in the 
> comments whether or not to support __call__. I would definitely say yes, 
> but I don't quite understand what you are doing with __getitem__.
> 
> I assume that NamedProperties in COM can have more than one optional 
> argument, and if this os so, then calling would be the only way to pass 
> more than one argument. From what I can see, at the moment we're 
> supposed to do something like bla.accName[0] rather than bla.accName(0)?
> Also, what happens if you want to not provide the optional argument at all?
> Obviously in python you can't write bla.accName[], but with __call__ you 
> could at least do bla.accName()

The idea was to use always use [...] notation for property accesses with 
arguments
(what I call NamedProperties).  This is because of the symmetry between getting 
and setting:

print foo[a, b, c]
foo[a, b, c] = something

Normal properties (not taking arguments) are accessed in the usual way:

print foo.attr
foo.attr = something

Ok, so the problem occurs when accessing a property which takes optional
arguments, and you don't want to pass any.  Obviously 'foo.attr()' does work,
but how to set it - 'foo.attr() = something' is invalid syntax,
but 'foo.attr[] = something' and 'print foo.attr[]' are invalid as well.

AFAIK pywin32 solves that by creating separate setter functions like
'foo._setattr(something)' but I don't like this.

So I decided to do it differently in comtypes (the approach I describe here
is already implemented for the usual early bound COM calls, but not yet for
the comtypes.client.lazybind or comtypes.client.dynamic module):

Python lets you call __getitem__(self, index) with any number of arguments,
although the syntax is a little bit strange first.  It becomes clearer when
you think of the signature __getitem__(self, *args).  Here is an interactive
session; it shows that you can call x[...] with more one or more arguments:

>>> class X(object):
...     def __getitem__(self, *args):
...         print "__getitem__", args
...     def __setitem__(self, *args):
...         print "__setitem__", args
...
>>> x = X()
>>>
>>> x[()]
__getitem__ ((),)
>>> x[1]
__getitem__ (1,)
>>> x[1, 2]
__getitem__ ((1, 2),)
>>> x[1, 2, 3]
__getitem__ ((1, 2, 3),)
>>>

The strange thing is that calling 'x[()]' behaves in the same way as the 
hypothetical call 'x[]' had been made.
BTW: the same holds for __setitem__(self, *args):

>>> x[()] = 42
__setitem__ ((), 42)
>>> x[1] = 42
__setitem__ (1, 42)
>>> x[1, 2] = 42
__setitem__ ((1, 2), 42)
>>> x[1, 2, 3] = 42
__setitem__ ((1, 2, 3), 42)
>>>
>>>

>>> x[()] = 42
__setitem__ ((), 42)
>>> x[1] = 42
__setitem__ (1, 42)
>>> x[1, 2] = 42
__setitem__ ((1, 2), 42)
>>> x[1, 2, 3] = 42
__setitem__ ((1, 2, 3), 42)
>>>
>>>

One obvious fault of the above is that it is impossible to access properties
with named arguments (but comtypes.client.dynamic and comtypes.client.lazybind
does not accept named arguments anyway in methods currently).

Thomas


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
comtypes-users mailing list
comtypes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/comtypes-users

Reply via email to