[Numpy-discussion] vectorize() broken on Python2.6
George Trojan
george.trojan at noaa.gov
Tue Oct 6 16:42:22 EDT 2009
f2py generated wrappers cannot be vectorized with numpy1.3.0 and Python2.6.2.
The reason is change to Python's getargs.c. Vectorize, or rather _get_nargs()
defined in lib/function_base.py tries to determine the number of arguments from
error message generated while the interpreter parses function invocation without
any arguments. The messages (in getargs.c) have changed, for example:
Required argument 'a' (pos 1) not found
Since the message no longer contains information how many arguments a function
takes, a fix is not obvious. Is there a solution coming soon?
I posted a message on comp.lang.python few days ago. Sturda Molden generated bug
report http://projects.scipy.org/numpy/ticket/1247. However the change he
suggests does not fix the problem.
I am tempted to apply a temporary workaround for my current needs:
The __init__ method in vectorize would accept an additional argument,
interface=None. That argument would be a Python code stub, prepared manually
(though it could easily be generated by f2py). This stub would be used by
_get_nargs() when the original object does not contain attribute 'func_code'.
Example:
Fortran code
integer function f3(a, b, c)
integer, intent(in) :: a, b
integer, optional, intent(in) :: c
if (present(c)) then
f3 = a - b
else
f3 = a + b
endif
end function f3
Interface
def f3_iface(a, b, c=None):
pass
Call
vf3 = numpy.vectorize(ftest.f3, f3_iface)
Are there any drawbacks to this approach?
George
More information about the NumPy-Discussion
mailing list