2010-02-18 7 views
2

Si j'essaie de surcharger une fonction Python intégrée pour que le second argument puisse être long ou Objet, existe-t-il un moyen standard de le faire? Est-ce ceci?Surcharge des fonctions Python intégrées à l'aide de PyArg_ParseTuple

Ce que je suis en train maintenant (noms changés pour protéger les innocents):

bool UseLongVar2 = true; 
    if (!PyArg_ParseTuple(args, "ll:foo", &LongVar1, &LongVar2)) 
    { 
     PyErr_Clear(); 
     if (!PyArg_ParseTuple(args, "lO&:foo", &LongVar1, convertObject, &Object)) 
     { 
     UseLongVar2 = false; 
     return NULL; 
     } 
    } 

Répondre

3

Ce que je fais normalement est d'avoir deux fonctions C qui prennent les différents arguments. Le travail de la fonction "python-facing" consiste à analyser les arguments, à appeler la fonction C appropriée et à générer la valeur de retour le cas échéant.

Ceci est assez courant lorsque, par exemple, vous souhaitez autoriser à la fois les chaînes de type octet et Unicode.

Voici un exemple de ce que je veux dire.

// Silly example: get the length of a string, supporting Unicode and byte strings 
static PyObject* getlen_py(PyObject *self, PyObject *args) 
{ 
    // Unpack our argument (error handling omitted...) 
    PyObject *arg = NULL; 
    PyArg_UnpackTuple(args, "getlen", 1, 1, arg) ; 

    if (PyUnicode_Check(arg)) 
    { 
     // It's a Unicode string 
     return PyInt_FromLong(getlen_w(PyUnicode_AS_UNICODE(arg))) ; 
    } 
    else 
    { 
     // It's a byte string 
     return PyInt_FromLong(getlen_a(PyString_AS_STRING(arg))) ; 
    } 
} 
+0

En quoi cela diffère-t-il de ce que je fais ici? Après le code d'exemple je peux dire quelque chose le long de la ligne de "résultat = UseLongVar2? FooLong (LongVar1, LongVar2): fooObj (LongVar1, Object)"? – patros

+0

Juste pour clarifier: Je suis intéressé par la façon de dire quels types d'arguments ont été transmis à partir de Python. Y a-t-il quelque chose de mieux que PyArg_ParseTuple, ou existe-t-il un raccourci plus propre pour séparer les différents types de variables? La construction que j'utilise serait complètement hideuse même pour quelques arguments qui pourraient avoir 2 ou 3 types possibles. – patros

+0

Ceci est différent parce que, à votre façon, vous faites deux tests. D'abord le test pour voir s'il a réussi, et ensuite vous devrez tester les indicateurs que vous avez définis pour voir quels arguments analyser. Avec la façon dont je l'ai décrit, vous ne faites qu'un test. Et non, je ne pense pas qu'il y ait une façon plus propre de vérifier les args que vous avez. Une autre bonne raison de garder les arguments dans les extensions C simples. –