6.2.4.2.2. mapply

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