Existe-t-il un moyen de déboguer une fonction définie dynamiquement en cours d'exécution?Comment déboguer des fonctions définies dynamiquement en Python?
Ou au moins existe-t-il un moyen facile de savoir où cette fonction est produite?
mise à jour pour donner plus de détails:
I utilisé inspect
Module:
ipdb> inspect.getmodule(im.get_thumbnail_url)
Out[0]: <module 'django.utils.functional' from 'C:\java\python\Python25\Lib\site
-packages\django\utils\functional.pyc'>
ipdb> inspect.getsource(im.get_thumbnail_url)
Out[0]: ' def _curried(*moreargs, **morekwargs):\n return _curried_fun
c(*(args+moreargs), **dict(kwargs, **morekwargs))\n'
Ici inspect
montre que la méthode get_thumbnail_url
de photos.models.Image
classe de pinax est produit par django.utils.functional.curry._curried
fonction. Mais il ne montre toujours pas où la méthode est produite, à savoir où est la fonction _curried
appelée. Cette information est nécessaire pour savoir comment get_thumbnail_url
est implémenté.
Je peux mettre pdb
à l'intérieur de _curried
fonction, mais alors il casse beaucoup de fois là parce que c'est un appel de fonction très fréquemment utilisé. Je dois avoir une caractéristique distinctive pour utiliser la condition de point de rupture.
Mise à jour sur la solution:
Merci pour toutes les suggestions. J'ai trouvé la solution. Laissez-moi vous expliquer comment je l'ai trouvé. Peut-être que cela va aider les autres:
D'abord, j'ai cherché le terme 'get_thumbnail_url' dans le code source de pinax. Pas de résultat. Deuxièmement, j'ai cherché le terme «miniature» dans le code source de pinax. Pas de résultat utile Enfin, j'ai cherché le terme 'curry' dans le code source de pinax. Ce qui suit a été l'un de plusieurs résultats:
def add_accessor_methods(self, *args, **kwargs):
for size in PhotoSizeCache().sizes.keys():
setattr(self, 'get_%s_size' % size,
curry(self._get_SIZE_size, size=size))
setattr(self, 'get_%s_photosize' % size,
curry(self._get_SIZE_photosize, size=size))
setattr(self, 'get_%s_url' % size,
curry(self._get_SIZE_url, size=size))
setattr(self, 'get_%s_filename' % size,
curry(self._get_SIZE_filename, size=size))
méthode get_thumbnail_url
est produit par cet appel: curry(self._get_SIZE_url, size=size))
.
Mais bien sûr, ce n'est pas une méthode de solution générale. Si vous pouvez partager des moyens alternatifs pour savoir où une fonction définie dynamiquement est réellement produite, ce serait très utile.
Edit:
Le meilleur general solution est écrit ci-dessous par Jason Orendorff.
Que voulez-vous dire par "fonction définie dynamiquement"? Est-ce une fonction 'lambda' ou une fonction générée par' exec ("def foo(): barre de retour") 'ou quelque chose de similaire? –
Plus précisément, la fonction que j'essaie d'introspecter maintenant est une fonction au curry. Je ne pense pas que ce soit une fonction lambda ou une fonction générée par exec. Je ne sais pas comment il est défini exactement parce que je ne sais pas où il est produit. Mais je suppose que l'auteur a utilisé une sorte de dispatching. –
Pouvez-vous poster un exemple de code? – richo