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