J'ai le code suivant qui fonctionne: donc j'ai Ce que je veux faire, c'est écrire un wrapper: p> mais cela jette une erreur: p> Impossible de convertir l'objet Python en 'Function_Type' P>
BlockQuote> J'ai aussi essayé de Cast Func ( Les objets Python ne peuvent pas être couplés aux pointeurs de types primitifs p>
blockQuote> L'idée forte> derrière ceci est la suivante: tout utilisateur sera en mesure d'écrire sa propre fonction en Cython, de la compiler puis d'importer et de transmettre sa fonction à est-il même possible d'importer une fonction pure C et de le transmettre en tant que paramètre avec Cyron? p> J'ai aussi vu Pass Cython Fonctions via l'interface Python mais contrairement à la solution là-bas, je ne suis pas capable de changer lambda_c code> fonction qui prend la fonction c comme argument et je ne suis pas capable de le changer ( comme il s'agit d'une wrapper sur la bibliothèque C appuyée par une autre équipe). p>
Retour Lambda_c (
PYCLASS () .py_wrap code> méthode. p>
lambda_c code> Functon et transformez-le en une classer. De plus,
lambda_c code> ne prend que des fonctions de certains types (
fonction_type code> dans notre exemple) p> p>
3 Réponses :
Merci à @ead, j'ai changé de code un peu et le résultat me satisfait:
cdef class PyClass: cdef void py_wrap(self, function_type func, e, f): print(lambda_c(func, e, f)) PyClass().py_wrap(mult, 5, 5)
Une façon que vous puissiez exposer le pointeur de fonction sur Python serait d'envelopper ce pointeur de fonction dans une classe CDEF à la place. Une autre option pourrait être d'utiliser l'API de capsule de Python pour envelopper le pointeur de la fonction à la place. Vous voudrez peut-être jeter un coup d'œil à SciPy's Lowlevelcallable pour une inspiration.
Si vous voulez transmettre un python arbitraire em> appelable appelable en tant que pointeur de fonction C, il ne fonctionne pas - il n'y a aucun moyen de le faire dans la norme C (et il est donc impossible à Cyton de générer le code). Il y a une solution de contournement très hackys impliquant Si vous êtes heureux pour votre Utilisateurs à écrire Écrivez une classe d'enveloppe appropriée (vous devez simplement modifier le type de pointeur de la fonction) - Ceci est divisé entre vos fichiers em> .pxd et .pyx que vous écrivez. P> < / li>
avez vos utilisateurs Changement Vos utilisateurs peuvent ensuite utiliser leurs fonctions compilées de Python: P>
Vraiment tout cela se fait consiste à utiliser un petit wrapper Python pour vous permettre de passer autour d'un type que Python ne peut normalement gérer. Vous êtes assez limité dans ce qu'il est possible de faire avec ces pointeurs de fonction emballés (par exemple, ils doivent em> doivent être mis en place dans Cyron) mais cela donne une poignée pour les sélectionner et les transmettre. P> p> CTYPES CODE> (qui peut effectuer une génération de code d'exécution que je trouverai des liens si nécessaire. Cependant, je ne le recommande pas vraiment.
CDEF code> Fonctions de Cython (la question implique que vous êtes), vous pouvez simplement construire sur ma réponse à Votre question hier . p>
CIMPORT CODE> IT, puis utilisez-le pour exposer leur
CDEF CODE> CDSEC sur Python: P>
pyclass code> pour prendre
Funcwrapper code> comme argument: p>
Merci beaucoup! Un détail de plus, pour autant que je sache, je peux compiler le colis principal et que CIMPORT d'en installer l'un, le FunCwrapper CODE> et en entraîne un nouveau. J'ai essayé cela, mais obtenez
'wrap.pxd' non trouvé code> lorsque vous essayez de cimport wrap. J'ai ajouté
packages = ['wrap'] code> à la fonction de configuration de seugools mais cela n'a pas aidé
Je pense que la principale chose est pour wrap.pxd code> sur le chemin Python. En tant que preuve de concept, essayez de créer votre autre package dans le même répertoire que
wrap code> et cela devrait fonctionner. Si vous utilisez un répertoire différent, le
cimport code> doit refléter cela. C'est toujours quelque chose qui est un peu difficile à faire malheureusement et je ne comprends pas la meilleure pratique que bien
Je ne suis pas sûr que si vous êtes autorisé à modifier le type de pointeur de fonction de à p> mais c'est généralement le Les fonctions de rappel des voies sont implémentées dans C. Premièrement, créez le fichier de définition suivant en Cython pour révéler votre API C à d'autres utilisateurs de Cyron: P> Void * code> paramètre
func_d code> à la fonction contient les données fournies par l'utilisateur sous n'importe quel formulaire. Si la réponse est oui, vous pouvez avoir la solution suivante. P>
print(call_me(lambda x, y: x - y, 5, 6))
Vous ne pouvez pas transmettre un pointeur comme argument à une fonction def, uniquement à CDEF.
@ead est-il passable de passer le pointeur dans
CDEF PY_WRAP (FUNC, E, F) CODE> Méthode de classe
pyclass code>?