5: #line 265 "mxTools.pak" 6: def napply(number_of_calls, function, args=(), kw = {}): 7: alist = [] 8: for i in range(number_of_calls): 9: alist.append(apply(function, args, kw)) 10: return tuple(alist)
184: #line 271 "mxTools.pak" 185: 186: Py_C_Function( mxTools_napply, 187: "napply(number_of_calls,function,args=(),kw={})\n\n" 188: "Calls the function number_of_calls times with the same\n" 189: "arguments and returns a tuple with the return values.") 190: { 191: int count; 192: register int i; 193: PyObject *func,*arg = 0,*kw = 0; 194: PyObject *w = 0; 195: 196: Py_Get4Args("iO|OO",count,func,arg,kw); 197: 198: Py_XINCREF(arg); 199: 200: w = PyTuple_New(count); 201: if (w == NULL) 202: goto onError; 203: 204: if (arg == NULL) 205: arg = PyTuple_New(0); 206: if (arg == NULL) 207: goto onError; 208: 209: #ifdef PyCFunction_GET_FUNCTION 210: /* Short-cut for C functions, taken from ceval.c:call_builtin(); 211: Note: this only works and is used together with my patched 212: version of the interpreter. XXX Update when ceval.c changes !!! */ 213: if (PyCFunction_Check(func)) { 214: register PyCFunction meth = PyCFunction_GET_FUNCTION(func); 215: register PyObject *self = PyCFunction_GET_SELF(func); 216: int flags = PyCFunction_GET_FLAGS(func); 217: 218: if (!(flags & METH_VARARGS)) { 219: int size = PyTuple_GET_SIZE(arg); 220: if (size == 1) 221: arg = PyTuple_GET_ITEM(arg, 0); 222: else if (size == 0) 223: arg = NULL; 224: } 225: if (flags & METH_KEYWORDS) 226: for (i = 0; i < count; i++) { 227: register PyObject *v; 228: 229: v = (*(PyCFunctionWithKeywords)meth)(self, arg, kw); 230: if (v == NULL) 231: goto onError; 232: PyTuple_SET_ITEM(w,i,v); 233: } 234: else { 235: if (kw != NULL && PyDict_Size(kw) != 0) { 236: PyErr_SetString(PyExc_TypeError, 237: "this function takes no keyword arguments"); 238: return NULL; 239: } 240: for (i = 0; i < count; i++) { 241: register PyObject *v; 242: 243: v = (*meth)(self, arg); 244: if (v == NULL) 245: goto onError; 246: PyTuple_SET_ITEM(w,i,v); 247: } 248: } 249: } 250: else 251: #endif 252: for (i = 0; i < count; i++) { 253: register PyObject *v; 254: 255: v = PyEval_CallObjectWithKeywords(func,arg,kw); 256: if (v == NULL) 257: goto onError; 258: PyTuple_SET_ITEM(w,i,v); 259: } 260: 261: Py_XDECREF(arg); 262: return w; 263: 264: onError: 265: Py_XDECREF(w); 266: Py_XDECREF(arg); 267: return NULL; 268: } 269: