On Aug 16, 1:25 am, Wolfgang Grafen <[EMAIL PROTECTED]> wrote: > Rafeschrieb: > > > On Aug 15, 10:27 pm, Wolfgang Grafen <[EMAIL PROTECTED]> > > 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 -- http://mail.python.org/mailman/listinfo/python-list