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

vml victor.lebrun at gmail.com
Thu May 3 08:41:57 EDT 2007


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 !





More information about the Python-list mailing list