
I really, really, really like the Cephes module and a lot of the work Travis Oliphant has been doing on Numeric Python. Nice to see Numeric getting more and more powerful all the time. However, as more and more functions get added to the libraries, their names become more and more obscure, and it sure would be nice to have doc-strings for them. For the stock Numeric ufuncs like "add", the meanings are self-evident, but things like "pdtri" and "incbet" are a bit less obvious. (One of my pet peeves with Python is that there are so many functions and classes with empty doc-strings. Bit by bit, I'm trying to add them in). However, one little problem with the current Numeric implementation is that ufunc objects don't have support for a doc string, the doc string is hardwired in the type object, and comes up as: "Optimizied FUNCtions make it possible to implement arithmetic with matrices efficiently" This is not only non-helpful, it's misspelled ("Optimizied"?) Well, according to the charter, a well-behaved Nummie will "Fix bugs at will, without prior consultation." But a well-behaved Nummie wil also "Add new features only after consultation with other Nummies" So, I hereby declare doing something about the useless doc-strings to be fixing a bug and not adding a feature ;-) The patch below adds doc strings to all the ufuncs in the Cephes module. They are automatically extracted from the HTML documentation for the Cephes module. (In the process of doing this, I also added some missing items to said HTML documentation). This patch depends on another patch, which I am submitting via the SourceForge, which allows ufunc objects to have doc strings. With these patches, you get this: >>> import cephes >>> print cephes.incbet.__doc__ incbet(a,b,x) returns the incomplete beta integral of the arguments, evaluated from zero to x: gamma(a+b) / (gamma(a)*gamma(b)) * integral(t**(a-1) (1-t)**(b-1), t=0..x). instead of this: >>> print cephes.incbet.__doc__ Optimizied FUNCtions make it possible to implement arithmetic with matrices efficiently Isn't that nicer? "Ni-Ni-Numpy!" Here's the "gendoc.py" script to pull the docstrings out of included_functions.h: #!/usr/bin/env python """generate cephes_doc.h from included_functions.html""" import string def parse(infile): d={} key=None val='' for line in infile.readlines(): if not string.strip(line): continue if line[0]=='<': if key and val: d[key]=string.strip(val) key,val=None,None if line[:4]=='<DT>': tok=string.split(line) tok=string.split(tok[-1],'(') key=tok[0] elif line[:4]=='<DD>' and key: val=line[4:] else: if val: val=val+line return d if __name__=="__main__": d = parse(open("docs/included_functions.html",'r')) keys = d.keys() keys.sort() ofile=open("cephes_doc.h",'w') for key in keys: ofile.write('#define %s_doc "%s"\n'%(key,repr(d[key])[1:-1])) ofile.close() And here are the patches to cephes: --- cephes-1.2/Makefile Tue Dec 28 15:53:11 1999 +++ cephes-1.2.cgw/Makefile Thu Mar 23 14:40:02 2000 @@ -15,8 +15,11 @@ $(FC) -shared $(FFLAGS) -o cephesmodule.so $(OBJS) \ -L./cephes -lcephes -L./amos -lamos -L./toms -ltoms -cephesmodule.o: cephesmodule.c +cephesmodule.o: cephesmodule.c cephes_doc.h $(CC) -c $(CFLAGS) -fPIC cephesmodule.c + +cephes_doc.h: docs/included_functions.html + python gendoc.py amos/libamos.a: cd amos && make CC=$(CC) CFLAGS="$(CFLAGS)" FC=$(FC) FFLAGS="$(FFLAGS)" --- cephes-1.2/docs/included_functions.html Sat Mar 27 00:27:18 1999 +++ cephes-1.2.cgw/docs/included_functions.html Thu Mar 23 14:39:03 2000 @@ -7,7 +7,7 @@ <DT>(Ai,Aip,Bi,Bip) = airy(z) <DD>airy(z) calculates the Airy functions and their derivatives evaluated at real or complex number z. The Airy functions Ai and Bi -are two independent solutions of y"(x)=xy. Aip and Bip are the first derivatives +are two independent solutions of y''(x)=xy. Aip and Bip are the first derivatives evaluated at x of Ai and Bi respectively. <DT>(Aie,Aipe,Bie,Bipe) = airye(z) @@ -19,7 +19,7 @@ <h1> Elliptic Functions and Integrals </h1> <DL> -<DT>(sn,cn,dn,ph) = ellpj_sn(u,m) +<DT>(sn,cn,dn,ph) = ellpj(u,m) <DD>ellpj calculates the Jacobian elliptic functions of parameter m between 0 and 1, and real u. The returned functions are often written sn(u|m), cn(u|m), and dn(u|m). The value of ph is such @@ -430,11 +430,12 @@ <DT>y = cosm1(x) <DD>calculates cos(x) - 1 for use when x is near zero. -</DL> - - - +<DT>y = round(x) +<DD>Returns the nearest integer to x as a double precision +floating point result. If x ends in 0.5 exactly, the +nearest even integer is chosen. +</DL> --- cephes-1.2/cephesmodule.c Tue Dec 28 15:32:26 1999 +++ cephes-1.2.cgw/cephesmodule.c Thu Mar 23 14:24:37 2000 @@ -23,6 +23,8 @@ #include <math.h> #endif +#include "cephes_doc.h" + static PyUFuncGenericFunction cephes1_functions[] = { NULL, NULL, }; static PyUFuncGenericFunction cephes1_2_functions[] = { NULL, NULL, }; static PyUFuncGenericFunction cephes1c_4_functions[] = { NULL, NULL, NULL, NULL }; @@ -220,335 +222,435 @@ /* Create function objects for each function call and insert them in the dictionary */ - f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtrc_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "bdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtrc_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "bdtrc", bdtrc_doc, 1); PyDict_SetItemString(dictionary, "bdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtr_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "bdtr", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtr_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "bdtr", bdtr_doc, 1); PyDict_SetItemString(dictionary, "bdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtri_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "bdtri", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtri_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "bdtri", bdtri_doc, 1); PyDict_SetItemString(dictionary, "bdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, btdtr_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "btdtr", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, btdtr_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "btdtr", btdtr_doc, 1); PyDict_SetItemString(dictionary, "btdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtrc_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "fdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtrc_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "fdtrc", fdtrc_doc, 1); PyDict_SetItemString(dictionary, "fdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtr_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "fdtr", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtr_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "fdtr", fdtr_doc, 1); PyDict_SetItemString(dictionary, "fdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtri_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "fdtri", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtri_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "fdtri", fdtri_doc, 1); PyDict_SetItemString(dictionary, "fdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, gdtrc_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "gdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, gdtrc_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "gdtrc", gdtrc_doc, 1); PyDict_SetItemString(dictionary, "gdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, gdtr_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "gdtr", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, gdtr_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "gdtr", gdtr_doc, 1); PyDict_SetItemString(dictionary, "gdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes4_functions, hyp2f1_data, cephes_5_types, 2, 4, 1, PyUFunc_None, "hyp2f1", 1); + f = PyUFunc_FromFuncAndData(cephes4_functions, hyp2f1_data, cephes_5_types, + 2, 4, 1, PyUFunc_None, "hyp2f1", hyp2f1_doc, 1); PyDict_SetItemString(dictionary, "hyp2f1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, hyperg_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "hyperg", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, hyperg_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "hyperg", hyperg_doc, 1); PyDict_SetItemString(dictionary, "hyperg", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes4a_2_functions, hyp2f0_data, cephes_6_types, 2, 4, 2, PyUFunc_None, "hyp2f0", 1); + f = PyUFunc_FromFuncAndData(cephes4a_2_functions, hyp2f0_data, cephes_6_types, + 2, 4, 2, PyUFunc_None, "hyp2f0", hyp2f0_doc, 1); PyDict_SetItemString(dictionary, "hyp2f0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes4_2_functions, onef2_data, cephes_6_types, 2, 4, 2, PyUFunc_None, "onef2", 1); + f = PyUFunc_FromFuncAndData(cephes4_2_functions, onef2_data, cephes_6_types, + 2, 4, 2, PyUFunc_None, "onef2", onef2_doc, 1); PyDict_SetItemString(dictionary, "onef2", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes4_2_functions, threef0_data, cephes_6_types, 2, 4, 2, PyUFunc_None, "threef0", 1); + f = PyUFunc_FromFuncAndData(cephes4_2_functions, threef0_data, cephes_6_types, + 2, 4, 2, PyUFunc_None, "threef0", threef0_doc, 1); PyDict_SetItemString(dictionary, "threef0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, incbet_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "incbet", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, incbet_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "incbet", incbet_doc, 1); PyDict_SetItemString(dictionary, "incbet", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, incbi_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "incbi", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, incbi_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "incbi", incbi_doc, 1); PyDict_SetItemString(dictionary, "incbi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtrc_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "nbdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtrc_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "nbdtrc", nbdtrc_doc, 1); PyDict_SetItemString(dictionary, "nbdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtr_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "nbdtr", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtr_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "nbdtr", nbdtr_doc, 1); PyDict_SetItemString(dictionary, "nbdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtri_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "nbdtri", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtri_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "nbdtri", nbdtri_doc, 1); PyDict_SetItemString(dictionary, "nbdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, beta_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "beta", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, beta_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "beta", beta_doc, 1); PyDict_SetItemString(dictionary, "beta", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, lbeta_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "lbeta", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, lbeta_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "lbeta", lbeta_doc, 1); PyDict_SetItemString(dictionary, "lbeta", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, cbrt_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "cbrt", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, cbrt_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "cbrt", cbrt_doc, 1); PyDict_SetItemString(dictionary, "cbrt", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, chdtrc_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "chdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, chdtrc_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "chdtrc", chdtrc_doc, 1); PyDict_SetItemString(dictionary, "chdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, chdtr_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "chdtr", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, chdtr_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "chdtr", chdtr_doc, 1); PyDict_SetItemString(dictionary, "chdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, chdtri_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "chdtri", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, chdtri_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "chdtri", chdtri_doc, 1); PyDict_SetItemString(dictionary, "chdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, dawsn_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "dawsn", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, dawsn_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "dawsn", dawsn_doc, 1); PyDict_SetItemString(dictionary, "dawsn", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, ellie_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "ellie", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, ellie_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "ellie", ellie_doc, 1); PyDict_SetItemString(dictionary, "ellie", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, ellik_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "ellik", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, ellik_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "ellik", ellik_doc, 1); PyDict_SetItemString(dictionary, "ellik", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, ellpe_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "ellpe", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, ellpe_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "ellpe", ellpe_doc, 1); PyDict_SetItemString(dictionary, "ellpe", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, ellpk_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "ellpk", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, ellpk_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "ellpk", ellpk_doc, 1); PyDict_SetItemString(dictionary, "ellpk", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, exp10_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "exp10", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, exp10_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "exp10", exp10_doc, 1); PyDict_SetItemString(dictionary, "exp10", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, exp2_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "exp2", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, exp2_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "exp2", exp2_doc, 1); PyDict_SetItemString(dictionary, "exp2", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, Gamma_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "gamma", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, Gamma_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "gamma", gamma_doc, 1); PyDict_SetItemString(dictionary, "gamma", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, lgam_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "lgam", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, lgam_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "lgam", lgam_doc, 1); PyDict_SetItemString(dictionary, "lgam", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, i0_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "i0", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, i0_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "i0", i0_doc, 1); PyDict_SetItemString(dictionary, "i0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, i0e_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "i0e", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, i0e_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "i0e", i0e_doc, 1); PyDict_SetItemString(dictionary, "i0e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, i1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "i1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, i1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "i1", i1_doc, 1); PyDict_SetItemString(dictionary, "i1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, i1e_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "i1e", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, i1e_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "i1e", i1e_doc, 1); PyDict_SetItemString(dictionary, "i1e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, igamc_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "igamc", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, igamc_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "igamc", igamc_doc, 1); PyDict_SetItemString(dictionary, "igamc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, igam_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "igam", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, igam_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "igam", igam_doc, 1); PyDict_SetItemString(dictionary, "igam", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, igami_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "igami", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, igami_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "igami", igami_doc, 1); PyDict_SetItemString(dictionary, "igami", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2c_functions, iv_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "iv", 1); + f = PyUFunc_FromFuncAndData(cephes2c_functions, iv_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "iv", iv_doc, 1); PyDict_SetItemString(dictionary, "iv", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cp_functions, ive_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "ive", 1); + f = PyUFunc_FromFuncAndData(cephes2cp_functions, ive_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "ive", ive_doc, 1); PyDict_SetItemString(dictionary, "ive", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_4_functions, ellpj_data, cephes_6_types, 2, 2, 4, PyUFunc_None, "ellpj", 1); + f = PyUFunc_FromFuncAndData(cephes2_4_functions, ellpj_data, cephes_6_types, + 2, 2, 4, PyUFunc_None, "ellpj", ellpj_doc, 1); PyDict_SetItemString(dictionary, "ellpj", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, expn_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "expn", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, expn_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "expn", expn_doc, 1); PyDict_SetItemString(dictionary, "expn", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, jn_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "jn", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, jn_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "jn", jn_doc, 1); PyDict_SetItemString(dictionary, "jn", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, kn_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "kn", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, kn_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "kn", kn_doc, 1); PyDict_SetItemString(dictionary, "kn", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtrc_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "pdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtrc_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "pdtrc", pdtrc_doc, 1); PyDict_SetItemString(dictionary, "pdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtr_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "pdtr", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtr_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "pdtr", pdtr_doc, 1); PyDict_SetItemString(dictionary, "pdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtri_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "pdtri", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtri_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "pdtri", pdtri_doc, 1); PyDict_SetItemString(dictionary, "pdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, stdtr_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "stdtr", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, stdtr_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "stdtr", stdtr_doc, 1); PyDict_SetItemString(dictionary, "stdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, stdtri_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "stdtri", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, stdtri_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "stdtri", stdtri_doc, 1); PyDict_SetItemString(dictionary, "stdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, yn_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "yn", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, yn_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "yn", yn_doc, 1); PyDict_SetItemString(dictionary, "yn", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, smirnov_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "smirnov", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, smirnov_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "smirnov", smirnov_doc, 1); PyDict_SetItemString(dictionary, "smirnov", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, smirnovi_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "smirnovi", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, smirnovi_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "smirnovi", smirnovi_doc, 1); PyDict_SetItemString(dictionary, "smirnovi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1c_4_functions, airy_data, cephes_5c_types, 4, 1, 4, PyUFunc_None, "airy", 1); + f = PyUFunc_FromFuncAndData(cephes1c_4_functions, airy_data, cephes_5c_types, + 4, 1, 4, PyUFunc_None, "airy", airy_doc, 1); PyDict_SetItemString(dictionary, "airy", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1cp_4_functions, airye_data, cephes_5c_types, 4, 1, 4, PyUFunc_None, "airye", 1); + f = PyUFunc_FromFuncAndData(cephes1cp_4_functions, airye_data, cephes_5c_types, + 4, 1, 4, PyUFunc_None, "airye", airye_doc, 1); PyDict_SetItemString(dictionary, "airye", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_2_functions, fresnl_data, cephes_3_types, 2, 1, 2, PyUFunc_None, "fresnl", 1); + f = PyUFunc_FromFuncAndData(cephes1_2_functions, fresnl_data, cephes_3_types, + 2, 1, 2, PyUFunc_None, "fresnl", fresnl_doc, 1); PyDict_SetItemString(dictionary, "fresnl", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_2_functions, shichi_data, cephes_3_types, 2, 1, 2, PyUFunc_None, "shichi", 1); + f = PyUFunc_FromFuncAndData(cephes1_2_functions, shichi_data, cephes_3_types, + 2, 1, 2, PyUFunc_None, "shichi", shichi_doc, 1); PyDict_SetItemString(dictionary, "shichi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_2_functions, sici_data, cephes_3_types, 2, 1, 2, PyUFunc_None, "sici", 1); + f = PyUFunc_FromFuncAndData(cephes1_2_functions, sici_data, cephes_3_types, + 2, 1, 2, PyUFunc_None, "sici", sici_doc, 1); PyDict_SetItemString(dictionary, "sici", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, j0_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "j0", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, j0_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "j0", j0_doc, 1); PyDict_SetItemString(dictionary, "j0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, y0_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "y0", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, y0_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "y0", y0_doc, 1); PyDict_SetItemString(dictionary, "y0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, j1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "j1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, j1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "j1", j1_doc, 1); PyDict_SetItemString(dictionary, "j1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, y1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "y1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, y1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "y1", y1_doc, 1); PyDict_SetItemString(dictionary, "y1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2c_functions, jv_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "jv", 1); + f = PyUFunc_FromFuncAndData(cephes2c_functions, jv_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "jv", jv_doc, 1); PyDict_SetItemString(dictionary, "jv", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cp_functions, jve_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "jve", 1); + f = PyUFunc_FromFuncAndData(cephes2cp_functions, jve_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "jve", jve_doc, 1); PyDict_SetItemString(dictionary, "jve", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2c_functions, yv_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "yv", 1); + f = PyUFunc_FromFuncAndData(cephes2c_functions, yv_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "yv", yv_doc, 1); PyDict_SetItemString(dictionary, "yv", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cp_functions, yve_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "yve", 1); + f = PyUFunc_FromFuncAndData(cephes2cp_functions, yve_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "yve", yve_doc, 1); PyDict_SetItemString(dictionary, "yve", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, k0_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "k0", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, k0_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "k0", k0_doc, 1); PyDict_SetItemString(dictionary, "k0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, k0e_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "k0e", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, k0e_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "k0e", k0e_doc, 1); PyDict_SetItemString(dictionary, "k0e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, k1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "k1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, k1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "k1", k1_doc, 1); PyDict_SetItemString(dictionary, "k1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, k1e_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "k1e", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, k1e_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "k1e", k1e_doc, 1); PyDict_SetItemString(dictionary, "k1e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cp_functions, kv_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "kv", 1); + f = PyUFunc_FromFuncAndData(cephes2cp_functions, kv_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "kv", kv_doc, 1); PyDict_SetItemString(dictionary, "kv", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cp_functions, kve_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "kve", 1); + f = PyUFunc_FromFuncAndData(cephes2cp_functions, kve_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "kve", kve_doc, 1); PyDict_SetItemString(dictionary, "kve", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel1_data, cephes_3cp_types, 2, 2, 1, PyUFunc_None, "hankel1", 1); + f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel1_data, cephes_3cp_types, + 2, 2, 1, PyUFunc_None, "hankel1", hankel1_doc, 1); PyDict_SetItemString(dictionary, "hankel1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel1e_data, cephes_3cp_types, 2, 2, 1, PyUFunc_None, "hankel1e", 1); + f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel1e_data, cephes_3cp_types, + 2, 2, 1, PyUFunc_None, "hankel1e", hankel1e_doc, 1); PyDict_SetItemString(dictionary, "hankel1e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel2_data, cephes_3cp_types, 2, 2, 1, PyUFunc_None, "hankel2", 1); + f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel2_data, cephes_3cp_types, + 2, 2, 1, PyUFunc_None, "hankel2", hankel2_doc, 1); PyDict_SetItemString(dictionary, "hankel2", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel2e_data, cephes_3cp_types, 2, 2, 1, PyUFunc_None, "hankel2e", 1); + f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel2e_data, cephes_3cp_types, + 2, 2, 1, PyUFunc_None, "hankel2e", hankel2e_doc, 1); PyDict_SetItemString(dictionary, "hankel2e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, ndtr_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "ndtr", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, ndtr_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "ndtr", ndtr_doc, 1); PyDict_SetItemString(dictionary, "ndtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, erfc_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "erfc", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, erfc_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "erfc", erfc_doc, 1); PyDict_SetItemString(dictionary, "erfc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, erf_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "erf", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, erf_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "erf", erf_doc, 1); PyDict_SetItemString(dictionary, "erf", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, ndtri_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "ndtri", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, ndtri_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "ndtri", ndtri_doc, 1); PyDict_SetItemString(dictionary, "ndtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, psi_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "psi", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, psi_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "psi", psi_doc, 1); PyDict_SetItemString(dictionary, "psi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, rgamma_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "rgamma", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, rgamma_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "rgamma", rgamma_doc, 1); PyDict_SetItemString(dictionary, "rgamma", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, round_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "round", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, round_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "round", round_doc, 1); PyDict_SetItemString(dictionary, "round", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, sindg_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "sindg", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, sindg_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "sindg", sindg_doc, 1); PyDict_SetItemString(dictionary, "sindg", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, cosdg_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "cosdg", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, cosdg_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "cosdg", cosdg_doc, 1); PyDict_SetItemString(dictionary, "cosdg", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, radian_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "radian", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, radian_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "radian", radian_doc, 1); PyDict_SetItemString(dictionary, "radian", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, tandg_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "tandg", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, tandg_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "tandg", tandg_doc, 1); PyDict_SetItemString(dictionary, "tandg", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, cotdg_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "cotdg", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, cotdg_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "cotdg", cotdg_doc, 1); PyDict_SetItemString(dictionary, "cotdg", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, log1p_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "log1p", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, log1p_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "log1p", log1p_doc, 1); PyDict_SetItemString(dictionary, "log1p", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, expm1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "expm1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, expm1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "expm1", expm1_doc, 1); PyDict_SetItemString(dictionary, "expm1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, cosm1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "cosm1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, cosm1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "cosm1", cosm1_doc, 1); PyDict_SetItemString(dictionary, "cosm1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, spence_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "spence", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, spence_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "spence", spence_doc, 1); PyDict_SetItemString(dictionary, "spence", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, zetac_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "zetac", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, zetac_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "zetac", zetac_doc, 1); PyDict_SetItemString(dictionary, "zetac", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, struve_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "struve", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, struve_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "struve", struve_doc, 1); PyDict_SetItemString(dictionary, "struve", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, zeta_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "zeta", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, zeta_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "zeta", zeta_doc, 1); PyDict_SetItemString(dictionary, "zeta", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, kolmogorov_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "kolmogorov", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, kolmogorov_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "kolmogorov", kolmogorov_doc, 1); PyDict_SetItemString(dictionary, "kolmogorov", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, kolmogi_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "kolmogorovi", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, kolmogi_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "kolmogorovi", kolmogorovi_doc, 1); PyDict_SetItemString(dictionary, "kolmogorovi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1c_functions, wofz_data, cephes_1c_types, 2, 1, 1, PyUFunc_None, "wofz", 1); + f = PyUFunc_FromFuncAndData(cephes1c_functions, wofz_data, cephes_1c_types, + 2, 1, 1, PyUFunc_None, "wofz", wofz_doc, 1); PyDict_SetItemString(dictionary, "wofz", f); Py_DECREF(f); } NB: This stuff won't work at all without the corresponding patches to the Numeric core, to be posted shortly to the sourceforge site.

I really, really, really like the Cephes module and a lot of the work
Me too!
So, I hereby declare doing something about the useless doc-strings to be fixing a bug and not adding a feature ;-)
Great, this is a step in the right direction. I am still hoping for an interactive environment that lets me consult docstrings why I work, but that won't happen before most Python functions actually have docstrings. Konrad. -- ------------------------------------------------------------------------------- Konrad Hinsen | E-Mail: hinsen@cnrs-orleans.fr Centre de Biophysique Moleculaire (CNRS) | Tel.: +33-2.38.25.55.69 Rue Charles Sadron | Fax: +33-2.38.63.15.17 45071 Orleans Cedex 2 | Deutsch/Esperanto/English/ France | Nederlands/Francais -------------------------------------------------------------------------------

The CVS version now has doc strings for all the functions in umath. (C. Waldman, P. Dubois).

I really, really, really like the Cephes module and a lot of the work
Me too!
So, I hereby declare doing something about the useless doc-strings to be fixing a bug and not adding a feature ;-)
Great, this is a step in the right direction. I am still hoping for an interactive environment that lets me consult docstrings why I work, but that won't happen before most Python functions actually have docstrings. Konrad. -- ------------------------------------------------------------------------------- Konrad Hinsen | E-Mail: hinsen@cnrs-orleans.fr Centre de Biophysique Moleculaire (CNRS) | Tel.: +33-2.38.25.55.69 Rue Charles Sadron | Fax: +33-2.38.63.15.17 45071 Orleans Cedex 2 | Deutsch/Esperanto/English/ France | Nederlands/Francais -------------------------------------------------------------------------------

The CVS version now has doc strings for all the functions in umath. (C. Waldman, P. Dubois).
participants (4)
-
Charles G Waldman
-
David Ascher
-
Konrad Hinsen
-
Paul F. Dubois