Есть ли способ отладки функции, которая определяется динамически во время выполнения?
Или, по крайней мере, есть простой способ узнать, где производится эта функция?
Обновление, чтобы дать более подробную информацию:
Я использовал inspect
модуль:
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'
Здесь inspect
показывает, что метод get_thumbnail_url
класса photos.models.Image
пинакса создается функцией django.utils.functional.curry._curried
. Но он все еще не показывает, где создается метод, а именно, где вызывается функция _curried
. Эта информация необходима, чтобы узнать, как реализовано get_thumbnail_url
.
Я могу поместить pdb
в функцию _curried
, но тогда она ломается там много раз, потому что это очень часто используемый вызов функции. Мне нужно иметь некоторые отличительные особенности, чтобы использовать условие точки останова.
Обновление о решении:
Спасибо за все предложения. Я нашел решение. Позвольте мне объяснить, как я нашел это. Может быть, это поможет другим людям:
Сначала я искал термин 'get_thumbnail_url' в исходном коде pinax. Безрезультатно.
Во-вторых, я искал термин «миниатюра» в исходном коде pinax. Нет полезного результата.
Наконец, я искал термин «карри» в исходном коде pinax. Следующее было одним из нескольких результатов:
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))
get_thumbnail_url
метод производится этим вызовом: curry(self._get_SIZE_url, size=size))
.
Но, конечно, это не общий метод решения. Если вы можете поделиться альтернативными способами узнать, где на самом деле создается динамически определенная функция, это было бы очень полезно.
Edit:
Лучшее общее решение написано ниже Джейсоном Орендорффом.