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

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Thu May 3 08:20:42 EDT 2007


En Thu, 03 May 2007 04:54:43 -0300, vml <victor.lebrun 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



More information about the Python-list mailing list