2010-08-20 3 views
4

je code comme suit:PyArg_ParseTuple et un pointeur fonction de rappel

PyObject *callback; 
    PyObject *paths; 

    // Process and convert arguments 
    if (!PyArg_ParseTuple(args, "OO:schedule", &paths, &callback)) 
      return NULL; 

Qu'est-ce qui se passe exactement à l'intérieur PyArg_ParseTuple? Ma conjecture est que callback obtient le pointeur de fonction que j'ai passé à args (aussi PyObject *). Comment PyArg_ParseTuple convertit le pointeur de fonction en PyObject *?

Ce que je veux savoir, c'est ce qui se passe si je passe deux fois le même pointeur de la fonction de rappel. Je pense que callback reçoit un nouveau PyObject dans PyArg_ParseTuple, donc il aura une adresse mémoire différente à chaque fois, mais contiendra le même pointeur de fonction de rappel.

Mais si je callback PyObject_Hash, il produira une valeur différente à chaque fois, non? L'adresse est différente à chaque fois ..)

Répondre

1

PyArg_ParseTuple ne se soucie pas du type d'un argument "O". Aucune conversion n'est effectuée. Aucun nouvel objet n'est créé. L'adresse de l'objet est placée dans la variable C PyObject * que vous avez spécifiée. Il fait exactement la même chose pour chacun de vos deux arguments.

Je ne peux pas imaginer quelle est la pertinence de PyObject_Hash. Si vous voulez comparer deux incarnations de votre argument de rappel, utilisez simplement == sur les adresses.

0

Le fait est que si vous passez le même rappel deux fois, il recevra deux objets mais vous ne serez jamais autorisé à en lire seulement un qui est las. Vous aurez une sorte de fuite de mémoire car l'un des deux pointeurs ne sera pas référencé. Bien sûr, le garbage collector finira par passer après vous pour nettoyer tout le gâchis. Mais de toute façon ...

Je ai mal lu le PyObject_Hash devrait être appelé sur les appels et les chemins. Ce sera pareil. mais vous voulez probablement comparer le rappel et les chemins: if (callback == chemins) {printf ("c'est le même callabck");}

+0

Ce que je veux, c'est pouvoir savoir que c'est la même fonction de rappel. Comment je fais ça? – Paul