2011-12-01 3 views
5

소스 코드에서 파이썬 함수의 행 번호를 얻고 싶습니다. 난 런타임이 무엇인지 은 또한 결과의 행 번호를 부여파이썬 모듈에서 (데코레이터가 있거나없는) 함수의 줄 번호를 얻는 방법은 무엇입니까?

inspect.getsourcelines(object)  

검사 모듈은, 클래스, 메소드

가보고했다 개체이다.

데코레이터가있는 메소드의 경우 라인 번호를 참조하십시오. 위의 inspect 함수 포인터가 원하는 함수의 소스 코드가 아닌 실제 데코레이터의 소스 코드로 반환됩니다. 이렇게하려면 어떻게해야합니까? (인터프리터는 런타임에 데코레이터 내부의 래핑 (wrapping) 기능과 같은 기능을하지만, 잘못된 것일 수도 있음을 알고 있습니다.)

답변

4

일반적인 경우에는 쉬운 해결책이 없습니다.

데코레이터는 주어진 함수가 데코레이터가 디자인 된 작업을 수행하는 클로저에 "래핑 (wrapping)"하여 함수를 반환하는 함수입니다.

그러나 파일과 줄 번호 정보는 함수 개체 자체에 없으며이 정보를 래핑 된 함수에서 래퍼로 복사하여 수정할 수 없습니다. 이 데이터는 대신 해당 기능의 code 개체 (.func_code과 함께 사용 가능)에 포함되어 있으며 생성하려는 모든 클로저에서 공유됩니다.

>>> def bar(x): 
...  def foo(): 
...   return x 
...  return foo 
... 
>>> f1 = bar(1) 
>>> f2 = bar(2) 
>>> f1() 
1 
>>> f2() 
2 
>>> f1.func_code is f2.func_code 
True 
>>> 
+0

나는 expln을 주셔서 감사합니다. 심지어 'func_code'를 사용하면 라인 번호를 얻지 못합니다. 꾸미기 소스 코드. 내가 설정 라인을 무시 무시하고 진행합니다. 모든 데코레이터가있는 메소드의 경우. 내 질문은 지금 메서드가 _any_ 데코레이터인지 아닌지 (데코레이터 이름은 이전에 알려지지 않았 음) – Hari

+0

@ 하리 : 데코레이터가 원하는 모든 것을 반환 할 수 있습니다 (심지어 클로저가 아니거나 심지어 같은 함수 일 수도 있음). 함수를 데코 레이팅했는지 또는 함수 객체를 제공하지 않았는지를 알 수있는 100 % 확실한 메서드가 없기 때문에 입력을 받았을 가능성이 있습니다. – 6502

1

wrapt 모듈은 함수의 소스를 찾기 위해 필요한 메타 데이터를 보존 할뿐만 아니라 다른 성찰을 수행 장식을 쓸 수 있도록함으로써이 문제를 해결합니다. 마치 functools.wraps과 비슷합니다.

관련 문제