18: #line 471 "mxTools.pak" 19: def method_mapply(objects, methodname, args=(), kw={}): 20: alist = [] 21: for object in objects: 22: alist.append(apply(getattr(object,methodname),args, kw)) 23: return tuple(alist) 24:
375: #line 478 "mxTools.pak" 376: 377: Py_C_Function( mxTools_method_mapply, 378: "method_mapply(objects,methodname,args=(),kw={})\n\n" 379: "Calls the method methodname of all objects in the given\n" 380: "order with the same arguments and returns a tuple with\n" 381: "the return values.") 382: { 383: register int i; 384: int n; 385: PyObject *objects; 386: PyObject *arg = 0,*kw = 0; 387: PyObject *w = 0; 388: char *methodname; 389: 390: Py_Get4Args("Os|OO",objects,methodname,arg,kw); 391: 392: Py_XINCREF(arg); 393: 394: n = PySequence_Length(objects); 395: if (n < 0) 396: Py_Error(PyExc_TypeError, 397: "first argument must be a sequence"); 398: 399: w = PyTuple_New(n); 400: if (w == NULL) 401: goto onError; 402: 403: if (arg == NULL) 404: arg = PyTuple_New(0); 405: if (arg == NULL) 406: goto onError; 407: 408: for (i = 0; i < n; i++) { 409: register PyObject *func; 410: { 411: register PyObject *v; 412: v = PySequence_GetItem(objects,i); 413: if (!v) 414: goto onError; 415: func = PyObject_GetAttrString(v,methodname); 416: if (!func) { 417: Py_DECREF(v); 418: goto onError; 419: } 420: Py_DECREF(v); 421: } 422: #ifdef PyCFunction_GET_FUNCTION 423: /* Short-cut for C functions, taken from 424: ceval.c:call_builtin(); Note: this only works and is used 425: with my patched version of the interpreter. XXX Update when 426: ceval.c changes !!! */ 427: if (PyCFunction_Check(func)) { 428: PyObject *args = arg; 429: 430: if (!(PyCFunction_GET_FLAGS(func) & METH_VARARGS)) { 431: int size = PyTuple_GET_SIZE(args); 432: if (size == 1) 433: args = PyTuple_GET_ITEM(args, 0); 434: else if (size == 0) 435: args = NULL; 436: } 437: if (PyCFunction_GET_FLAGS(func) & METH_KEYWORDS) { 438: register PyObject *v; 439: v = (*(PyCFunctionWithKeywords)\ 440: PyCFunction_GET_FUNCTION(func))\ 441: (PyCFunction_GET_SELF(func), 442: args, kw); 443: if (v == NULL) { 444: Py_DECREF(func); 445: goto onError; 446: } 447: PyTuple_SET_ITEM(w,i,v); 448: } 449: else { 450: if (kw != NULL && PyDict_Size(kw) != 0) { 451: PyErr_SetString(PyExc_TypeError, 452: "this function takes no keyword arguments"); 453: return NULL; 454: } 455: else { 456: register PyObject *v; 457: v = (*PyCFunction_GET_FUNCTION(func))\ 458: (PyCFunction_GET_SELF(func), args); 459: if (v == NULL) { 460: Py_DECREF(func); 461: goto onError; 462: } 463: PyTuple_SET_ITEM(w,i,v); 464: } 465: } 466: } 467: else 468: #endif 469: { 470: register PyObject *v; 471: v = PyEval_CallObjectWithKeywords(func,arg,kw); 472: if (v == NULL) { 473: Py_DECREF(func); 474: goto onError; 475: } 476: PyTuple_SET_ITEM(w,i,v); 477: } 478: Py_DECREF(func); 479: } 480: 481: Py_XDECREF(arg); 482: return w; 483: 484: onError: 485: Py_XDECREF(w); 486: Py_XDECREF(arg); 487: return NULL; 488: } 489: