passing an array of variant in vb to a python COM object = win32com bug ?

Larry Bates larry.bates at websafe.com
Thu May 3 09:38:00 EDT 2007


vml wrote:
> On 3 mai, 14:20, "Gabriel Genellina" <gagsl-... at yahoo.com.ar> wrote:
>> En Thu, 03 May 2007 04:54:43 -0300, vml <victor.leb... at gmail.com> escribió:
>>
>>
>>
>>> I have a python com object which contains a method to inverse an array
>>> in vb 6 the definition of the class is :
>>> class Fop:
>>>     _public_methods_ = [ 'SqVal' ]
>>>     def SqVal(self,*val):
>>>         #vol=(val[0][0],val[0][1])
>>>         #mat1=mat((vol))
>>>         #up=linalg.inv(mat1)
>>>         return str(val)#up
>>>     _reg_verprogid_ = "Python.Fop.3"
>>>     _reg_progid_ = "Python.Fop"
>>>     _reg_desc_ = "Python Fop"
>>>     _reg_clsid_ = "{30BD3490-2632-11cf-AD5B-524153480001}"
>>> I pass to this method an array of variant which is the matrix to
>>> invert like that:
>>> vb6 code :
>>>    Set obj = CreateObject("Python.Fop")
>>>     Dim ty(1, 1) As Variant
>>>     ty(0, 0) = 1
>>>     ty(1, 0) = 2
>>>     ty(0, 1) = 3
>>>     ty(1, 1) = 4
>>>     toto = obj.SqVal(ty)
>>> when I dispaly toto as str(val) I obtain the following tuple "(((1,
>>> 3), (2, 4)),)" which is not usable ....
>>> Do you have an idea to explain this strange behaviour ?
>> This is the expected behaviour. Writing it completely in Python:
>>
>> py> def SqVal(*val):
>> ...   return str(val)
>> ...
>> py> ty=((1,3),(2,4))
>> py> SqVal(ty)
>> '(((1, 3), (2, 4)),)'
>>
>> The *val parameter receives a tuple, whose elements are the positional
>> arguments used when calling the function. As you call the function with a
>> single argument, val receives a tuple with a single element.
>> Perhaps you want to write it as:
>>
>> py> def SqVal(val):
>> ...   print val[0][0]
>> ...   print val[0][1]
>> ...   print val[1][0]
>> ...   print val[1][1]
>> ...
>> py> SqVal(ty)
>> 1
>> 3
>> 2
>> 4
>>
>> (Of course, if used as a Fop method, dont forget the "self" parameter)
>>
>> --
>> Gabriel Genellina
> 
> I just tried to replace the *val by SqVal(self,val) and call the
> method in vb but it crashes down :
> 
> "when refilling safe array the sequence must have the same number of
> dimension as the existing array"
> 
> my python code is now :
> 
>  def SqVal(self,val):
> ##        volr=[val[0][0][i] for i in range(size(val,2))]
> ##        voli=[val[0][1][i] for i in range(size(val,2))]
> ##        mat1=mat(volr)+1j*mat(voli)
> ##        up=linalg.pinv(mat1)
> ##        out=up.real.tolist()
> ##        out.extend(up.imag.tolist())
>         return val
> 
> By the way Do you have any idea to debug the com server script ? ( I
> would like to know if a can access the value in the function while
> calling it from vb 6)
> 
> 
> 
> 
> tahnks a lot !
> 
> 
Debugging COM objects is best done using logging module or at least
writing to a file during processing.  You can review the log file
to see what was going on.

-Larry



More information about the Python-list mailing list