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

V

vml

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 ?

thank you !
 
G

Gabriel Genellina

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)
 
V

vml

En Thu, 03 May 2007 04:54:43 -0300, vml <[email protected]> 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)

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] for i in range(size(val,2))]
## voli=[val[0][1] 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 !
 
L

Larry Bates

vml said:
En Thu, 03 May 2007 04:54:43 -0300, vml <[email protected]> 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)

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] for i in range(size(val,2))]
## voli=[val[0][1] 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
 
G

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"

That can't happen with your Python code below, so it must be on the
caller. Maybe you wrote something like: xx=something.SqVal(yy) and xx,yy
are declared of different sizes.
def SqVal(self,val):
## ...
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)

Write a log file as suggested, or use OutputDebugString with the DebugView
program from www.sysinternals.com
 
V

vml

That can't happen with your Python code below, so it must be on the
caller. Maybe you wrote something like: xx=something.SqVal(yy) and xx,yy
are declared of different sizes.

It is true that I call the python routine like that in vb :


toto = obj.SqVal(ty)

If I am understanding well I need to pass an array of 2x2 and I should
retireve an array of variant of 2x2 ....

I tried to do that :
vb6 :

Dim obj As Object
Dim toto(1, 1, 2) As Variant

Set obj = CreateObject("Python.Fop")
Dim ty(1, 1, 2) As Variant

ty(0, 0, 0) = 1
ty(0, 1, 0) = 2
ty(0, 0, 1) = 3
ty(0, 0, 2) = 7
ty(0, 1, 1) = 4
ty(0, 1, 2) = 45

ty(1, 0, 0) = 1
ty(1, 1, 0) = 2
ty(1, 0, 1) = 3
ty(1, 0, 2) = 7
ty(1, 1, 1) = 4
ty(1, 1, 2) = 45



toto = obj.SqVal(ty)



but it is saying that the compiler can not assign the array toto at
the line toto=obj.SqVal().... hum strange .....



any ideas ?


Thank you for your help !
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,901
Latest member
Noble71S45

Latest Threads

Top