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

Wolfgang Grafen wolfgang.grafen at ericsson.com
Fri Aug 15 11:27:03 EDT 2008


Rafe schrieb:
> Forgive me if I mangle any terminology here, but please correct me if
> I do...
> 
> I have an object which acts exactly like a string as long as I stay in
> Python land. However, I am using the object in Softimage|XSI, a 3D
> application on Windows. I'm getting variant erros when trying to use
> my instances as I would a string.
> 
> XSI was created while (briefly) owned by Microsoft, so knowledge of
> COM with excel, or anything else, should be applicable I should think.
> I should also say I am a COM novice and still learning the depths of
> Python.
> 
> Here is an example...
> 
> class StrLike(object):
>     def __init__(self, s): self.__data = s
>     def __repr__(self): return repr(self.__data)
>     def __cmp__(self, string): return cmp(self.__data, string)
>     def __contains__(self, char): return char in self.__data
> 
>     __data = ""
>     def __Set(self, value): self.__data = value
>     def __Get(self): return self.__data
>     data = property(fget = __Get,
>                     fset = __Set,
>                     fdel = None,
>                     doc  = "string-like example")
> 
> 
>>>> s = StrLike("test")
>>>> s
> 'test'
>>>> if s == "test": print "cmp works"
> cmp works
> 
> 
> 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



More information about the Python-list mailing list