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

Wolfgang Grafen wolfgang.grafen at ericsson.com
Fri Aug 15 14:25:15 EDT 2008


Rafe schrieb:
> On Aug 15, 10:27 pm, Wolfgang Grafen <wolfgang.gra... at ericsson.com>
> wrote:
>> Rafe schrieb:
>>
>>> 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



More information about the Python-list mailing list