[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