6.2.4.2.3. method_mapply

Comienzo python section to interscript/core/mxTools.py[4 /26 ] Siguiente Previo Primero Último
    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: 
End python section to interscript/core/mxTools.py[4]
Comienzo C section to interscript/core/mxTools.c[5 /30 ] Siguiente Previo Primero Último
   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: 
End C section to interscript/core/mxTools.c[5]