11: #line 358 "mxTools.pak" 12: def mapply(callable_objects, args=(), kw={}): 13: alist = [] 14: for callable in callable_objects: 15: alist.append(apply(callable,args, kw)) 16: return tuple(alist) 17:
270: #line 365 "mxTools.pak" 271: 272: Py_C_Function( mxTools_mapply, 273: "mapply(callable_objects,args=(),kw={})\n\n" 274: "Calls the callable_objects in the given order with the same\n" 275: "arguments and returns a tuple with the return values.") 276: { 277: register int i; 278: int n; 279: PyObject *objects; 280: PyObject *arg = 0,*kw = 0; 281: PyObject *w = 0; 282: 283: Py_Get3Args("O|OO",objects,arg,kw); 284: 285: Py_XINCREF(arg); 286: 287: n = PySequence_Length(objects); 288: if (n < 0) 289: Py_Error(PyExc_TypeError, 290: "first argument must be a sequence"); 291: 292: w = PyTuple_New(n); 293: if (w == NULL) 294: goto onError; 295: 296: if (arg == NULL) 297: arg = PyTuple_New(0); 298: if (arg == NULL) 299: goto onError; 300: 301: for (i = 0; i < n; i++) { 302: register PyObject *func; 303: func = PySequence_GetItem(objects,i); 304: if (!func) 305: goto onError; 306: #ifdef PyCFunction_GET_FUNCTION 307: /* Short-cut for C functions, taken from 308: ceval.c:call_builtin(); Note: this only works and is used 309: with my patched version of the interpreter. XXX Update when 310: ceval.c changes !!! */ 311: if (PyCFunction_Check(func)) { 312: PyObject *args = arg; 313: 314: if (!(PyCFunction_GET_FLAGS(func) & METH_VARARGS)) { 315: int size = PyTuple_GET_SIZE(args); 316: if (size == 1) 317: args = PyTuple_GET_ITEM(args, 0); 318: else if (size == 0) 319: args = NULL; 320: } 321: if (PyCFunction_GET_FLAGS(func) & METH_KEYWORDS) { 322: register PyObject *v; 323: v = (*(PyCFunctionWithKeywords)\ 324: PyCFunction_GET_FUNCTION(func))\ 325: (PyCFunction_GET_SELF(func), 326: args, kw); 327: if (v == NULL) { 328: Py_DECREF(func); 329: goto onError; 330: } 331: PyTuple_SET_ITEM(w,i,v); 332: } 333: else { 334: if (kw != NULL && PyDict_Size(kw) != 0) { 335: PyErr_SetString(PyExc_TypeError, 336: "this function takes no keyword arguments"); 337: return NULL; 338: } 339: else { 340: register PyObject *v; 341: v = (*PyCFunction_GET_FUNCTION(func))\ 342: (PyCFunction_GET_SELF(func), args); 343: if (v == NULL) { 344: Py_DECREF(func); 345: goto onError; 346: } 347: PyTuple_SET_ITEM(w,i,v); 348: } 349: } 350: } 351: else 352: #endif 353: { 354: register PyObject *v; 355: v = PyEval_CallObjectWithKeywords(func,arg,kw); 356: if (v == NULL) { 357: Py_DECREF(func); 358: goto onError; 359: } 360: PyTuple_SET_ITEM(w,i,v); 361: } 362: Py_DECREF(func); 363: } 364: 365: Py_XDECREF(arg); 366: return w; 367: 368: onError: 369: Py_XDECREF(w); 370: Py_XDECREF(arg); 371: return NULL; 372: } 373: 374: