Passing an object through COM which acts like str but isn't

Rafe rafesacks at gmail.com
Tue Aug 19 07:19:39 EDT 2008


On Aug 16, 1:25 am, Wolfgang Grafen <wolfgang.gra... at ericsson.com>
wrote:
> Rafeschrieb:
>
> > On Aug 15, 10:27 pm, Wolfgang Grafen <wolfgang.gra... at ericsson.com>
> > wrote:
> >>Rafeschrieb:
>
> >>> Now if I try to pass this as I would a string, roughly like so...
> >>>>>> s = StrLike("test")
> >>>>>> Application.AnObject.attribute = "test" # works fine
> >>>>>> Application.AnObject.attribute = s
> >>> ERROR : Traceback (most recent call last):
> >>>   File "<Script Block >", line 18, in <module>
> >>>     XSI.Selection[0].name = s
> >>>   File "C:\Python25\Lib\site-packages\win32com\client\dynamic.py",
> >>> line 544, in __setattr__
> >>>     self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value)
> >>> TypeError: Objects of type 'StrLike' can not be converted to a COM
> >>> VARIANT
> >>> Inheriting the str type doesn't raise any errors, but it's immutible
> >>> so it won't work. The attribute I am trying to set in XSI only takes a
> >>> string. So is it possible to make a string like object work like a
> >>> string in this scenario? Is there some built-in method I am missing or
> >>> some win32com.client trick? Help?
> >>> Thanks for reading,
> >>> -Rafe
> >> Add
> >> def __str__(self): return repr(self.__data)
>
> >> then
> >>  >>> Application.AnObject.attribute = str(s)
> >> should work
>
> >> untested
>
> >> Best Regards
>
> >> Wolfgang
>
> > Thanks for the reply.
>
> > I don't need __str__ because Python will automatically use __repr__
> > when __str__ isn't defined anyway. I also don't want people to have to
> > wrap this in str().
>
> > While str() does work, the real problem is usability. The user will
> > have to try it, decrypt the "can not be converted" error message and
> > then figure out on their own that they have to use str(). It will be
> > intuitive/expected to work especially when used within the context of
> > the XSI(application) SDK.
>
> > Surely there is a way to get my object to be == a string in the eyes
> > of COM.
>
> Nope. There is no automatic type casting. You have to write a function
> for this
> for the '.attribute' method, or you have to use str() which is quite
> useable and comprehensive IMO.
>
> Wolfgang

Thanks for confirming.

It seems like an mutable string class to inherit would solve this, but
that is a can-o-worms I've noticed.

I've been able to work around this by internalizing the object which I
want to act like a string and then using a Property to control the
access.

- Rafe



More information about the Python-list mailing list