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