11
votes

Utilisation de code CYTHON auto-défini à partir d'un autre code CYTHON

.

Je suis en train actuellement d'optimiser mon programme Python et ai commencé avec Cython afin de réduire la fonction d'appel en tête et peut-être plus tard inclure optimisés bibliothèques C fonctions Alors

je suis tombé sur le premier problème: p >

J'utilise la composition dans mon code pour créer une plus grande classe. Jusqu'à présent, j'ai obtenu une de mes classes Python converties en Cython (qui était assez difficile). Voici le code: p>

membraneClass.pyx:18:6: 'bendingForcesClass' is not a type identifier
building 'membraneClass' extension


4 commentaires

J'aimerais voir quel est le problème, alors gardez-nous posté si quelque chose fonctionne!


Je me rends compte que c'est une vieille question, mais j'ai un problème très similaire en ce moment. Avez-vous déjà compris cela?


Non. Malheureusement, je n'ai jamais résolu ce problème, car à un moment donné, cette partie du code est devenue sans importance pour mon projet. Quoi qu'il en soit, je vous souhaite bonne chance, et si vous le comprenez, postez-le ici et je serais heureux de l'accepter comme une réponse correcte.


Après beaucoup de recherche, j'ai trouvé cette réponse parfaite: Stackoverflow.com/Questtions/33616927/...


3 Réponses :


2
votes

Ce ne sont probablement pas la source de l'erreur, mais simplement pour affiner le problème, vous pouvez essayer de changer ce qui suit:

Pourrait-il être que vous utilisez Feuilles de frappe comme nom de la variable ici: xxx

et aussi le nom de l'objet membre ici: xxx

aussi, BendingforcesClass est le nom du module ainsi que la classe. Enfin, que diriez-vous de faire un CTTYPEDF à partir de la classe BendingforcesClass ?


1 commentaires

En raison de la modification de la question initiale à utiliser Pep8, cette réponse est légèrement en dehors de la synchronisation; Désolé pour ça.



7
votes

Disclaimer: em> Cette question est très ancienne et je ne suis pas sûr que la solution actuelle fonctionnerait pour le code CYTHON 2011.

afin de cimport une classe d'extension (classe CDEF) d'un autre fichier que vous avez besoin de fournir un .pxd fichier (également appelé définitions Fichier) déclarant toutes les classes, attributs et méthodes C. Voir Partage de types d'extension dans la documentation Pour référence. P>

Pour votre exemple, vous auriez besoin d'un fichier BendsforcesClass.pxd code>, qui déclare la classe que vous souhaitez partager, ainsi que tous les variables de niveau de module, Typedfs , etc .: p>

BendingforcesClass .pxd strong> p> xxx pré>

Toutes les importations, les variables et les attributs qui sont désormais déclarés dans le fichier .pxd code> peuvent (et devez être) supprimé du .PYX code> fichier: p>

Bendingforcesclass .pyx strong> P>

import numpy as np

cdef class bendingForcesClass(object):

    def __init__(self, dtype_t bendingRigidity, np.ndarray[dtype_t, ndim=2] waveNumbersNorm):
        self.bendingRigidity = bendingRigidity
        self.matrixPrefactor = -self.bendingRigidity * waveNumbersNorm ** 2

    cpdef np.ndarray calculate(self, np.ndarray membraneHeight):
        cdef np.ndarray bendingForces
        bendingForces = self.matrixPrefactor * membraneHeight
        return bendingForces


0 commentaires

4
votes

Vous devez utiliser une déclaration ".pxd" et CIMPORT. (Essentiellement, CIMPORT arrive au moment de la compilation, tandis que l'importation se produit au moment de l'exécution, de sorte que Cyron ne puisse utiliser quoi que ce soit important).

créer "utils.pxd": xxx

"utils.pyx" se lit maintenant xxx

toutes les déclarations qui ont été dans le fichier pyx entrent dans le fichier .pxd.

Puis dans myModule.pyx xxx

// réponse prolongée d'ici: Cython: Utilisation de la classe importée dans une déclaration de type


0 commentaires