런타임에 동적으로 정의 된 함수를 디버깅하는 방법이 있습니까?파이썬에서 동적으로 정의 된 함수를 디버깅하는 방법은 무엇입니까?
또는 적어도이 함수가 생성 된 위치를 쉽게 찾을 수 있습니까?
요금보다 상세히을 얻었다 : 여기 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'
가 pinax의 get_thumbnail_url
방법 photos.models.Image
의 클래스 django.utils.functional.curry._curried
함수에 의해 생성되는 것을 보여준다
제가 inspect
모듈을 사용 하였다. 하지만 여전히 방법이 어디서 생산되는지, 즉 _curried
함수가 호출 된 위치를 표시하지 않습니다. 이 정보는 get_thumbnail_url
이 어떻게 구현되는지 알아내는 데 필요합니다.
_curried
내부에 pdb
을 넣을 수 있지만 매우 자주 사용되는 함수 호출이기 때문에 거기에서 여러 번 분해됩니다. 중단 점 조건을 사용하려면 몇 가지 고유 한 기능이 필요합니다. 솔루션에 대해
업데이트 : 모든 제안
감사합니다. 해결책을 찾았습니다. 내가 그것을 어떻게 찾았는지 설명하겠습니다. 어쩌면 다른 사람들을 도울 것입니다 :
첫째, 나는 pinax 소스 코드에서 'get_thumbnail_url'용어를 검색했습니다. 결과가 없다. 두 번째로, 나는 pinax 소스 코드에서 'thumbnail'용어를 검색했다. 유용한 결과가 없습니다. 마지막으로, 나는 pinax 소스 코드에서 'curry'용어를 검색했습니다.
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))
다음은 몇 가지 결과 중 하나였다.
물론 이것은 일반적인 해결책 방법이 아닙니다. 동적으로 정의 된 함수가 실제로 어디서 만들어 지는지 확인하는 다른 방법을 공유 할 수 있다면 큰 도움이 될 것입니다.
편집 :
가장 general solution는 제이슨 Orendorff 아래에 기록됩니다.
"동적 정의 함수"란 정확히 무엇을 의미합니까? 이것은'lambda' 함수인가,'exec ("def foo() : return bar")'또는 이와 비슷한 것입니까? –
특히, 지금 인트로 스펙 트하려고하는 함수는 카레 함수입니다. 나는 그것이 λ 함수이거나 exec에 의해 생성 된 함수라고 생각하지 않는다. 나는 그것이 그것이 어디에서 생산되는지를 모르기 때문에 그것이 어떻게 정확하게 정의되어 있는지 모른다. 하지만 저자가 일종의 파견을했다고 생각합니다. –
몇 가지 샘플 코드를 게시 할 수 있습니까? – richo