2017-09-29 1 views
2

je jouais avec le tutoriel cython (http://docs.cython.org/en/latest/src/tutorial/cython_tutorial.html)Les fonctions définies dans Cython .pyx sont-elles intégrées?

Et j'ai un répertoire comme ceci:

somedir/ExampleCython.py 
somedir/fib.pyx 
somedir/fib.so 
somedir/function_file.py 
somedir/setup.py 

Lorsque la fib.pyx définit la fonction fib du tutoriel cython lien ci-dessus, function_file.py contient la définition suivante:

def moopy(param): 
    param += 1 
    return param 

et ExampleCython.py contient les éléments suivants:

import fib as moo 

print moo.fib 

from function_file import moopy 

print moopy 

Je construis le fib.so en utilisant python setup.py build_ext --inplace, puis je lance python ExampleCython.py et je reçois la sortie suivante:

<built-in function fib> 
<function moopy at 0x1002b4398> 

Maintenant, je sais qu'il n'y a pas python construit -appelé fib, et juste pour tester j'ai essayé de changer le nom «fib» à quelque chose de stupide comme «poopypants» et il dit toujours qu'il est intégré. Qu'arrive-t-il à l'espace de nom de la fonction fib? J'ai ce problème dans un autre bloc de code beaucoup plus grand qui m'empêche de décaper une classe que j'ai créée - Pickle se plaint de ne pas trouver ma fonction dans le module auquel elle appartient - mais je me suis dit que je simplifierais pour le question ici.

Pour référence - python 2.7.11/cython 0.26 sur OSX 10.12.6

+1

"intégré" est trompeur - cela signifie simplement qu'il s'agit d'une fonction implémentée dans une bibliothèque C (comme vous pouvez l'attendre de Cython). Vous êtes probablement mieux de créer un [mcve] qui illustre votre problème pickle (qui semble être ce que vous essayez vraiment de résoudre) – DavidW

+0

ok, que dois-je faire à cette question alors? l'éditer avec un exemple mis à jour, ou le fermer ou le marquer répondu ou quelque chose? –

+0

Je modifierais cette question. Puisque personne n'y a répondu, je ne pense pas que ce soit un problème d'y apporter une modification assez importante. (Votre choix cependant - les deux options sont raisonnables!) – DavidW

Répondre

2

Cela a été résolu dans un commentaire, mais publié en réponse complet:

Python est décrit les fonctions « intégré dans la fonction "purement pour signifier qu'il est compilé en C, plutôt que de signifier que c'est une fonction de bibliothèque standard, et donc il y avait un problème avec ceci - la fonction correcte était trouvée dans le bon module.

Sur mon PC, il apparaît <cyfunction module.function_name at 0xsome_address>, ce qui est un message plus utile. Je pense que cela pourrait être une amélioration de Python 3 (mais je ne suis pas sûr à 100%).