2008-10-28 3 views
39

나는 이것을 알아야만한다고 느낀다. 그러나 나는 그것을 이해할 수 없었다. ...파이썬 함수 또는 메서드 내에서 함수 또는 메서드의 이름을 얻으려면 어떻게해야합니까?

나는 내부에서부터 통합 테스트가 될 방법의 이름을 얻고 싶다. 진단 텍스트를 출력 할 수 있습니다. 물론 문자열의 메서드 이름을 하드 코딩 할 수도 있지만 가능하면 테스트를 좀 더 DRY로 만들고 싶습니다.

+0

가능한 [Python에서 함수 이름을 문자열로 가져 오는 방법은?] (http://stackoverflow.com/questions/251464/how-to-get-the-function-name-as-string-in- python) – DarenW

+0

@DarenW 아니에요. 함수 객체를 포함하는 변수에서 함수 이름을 요청하고 함수 이름을 내부에서 요청하는 것은 두 가지 다른 질문입니다. –

답변

23

대답은 합리적인 . 그러나 상황에 따라 다른 옵션이있을 수 있습니다.

통합 테스트가 unittest 모듈로 작성된 경우 을 TestCase에서 사용할 수 있습니다.

+1

방금 ​​self.id()가 unittest setUp() 메서드에서 작동한다는 것을 발견했습니다 (다른 솔루션과 달리 "setUp"자체가 아니라 테스트 이름을 반환 함). 그러므로 나는 이것을이 질문에 대한 대답으로 바꾸고있다. –

+0

@DarylSpitzer nice! – Dan

3

나는 traceback 모듈이 당신이 찾고있는 것일 수도 있다고 생각합니다. 특히 extract_stack 함수는 작업을 수행하는 것처럼 보입니다.

16

이 데코레이터는 함수 내에서 사용할 수있는 메서드 이름을 키워드 인수로 전달합니다.

from functools import wraps 
def pass_func_name(func): 
    "Name of decorated function will be passed as keyword arg _func_name" 
    @wraps(func) 
    def _pass_name(*args, **kwds): 
     kwds['_func_name'] = func.func_name 
     return func(*args, **kwds) 
    return _pass_name 

당신은 이런 식으로 사용합니다 :

@pass_func_name 
def sum(a, b, _func_name): 
    print "running function %s" % _func_name 
    return a + b 

print sum(2, 4) 

을하지만 어쩌면 당신은 당신이 장식 자체 내에서 직접 원하는 것을 기록 할 것입니다. 그런 다음 코드는 데코레이터에서 함수 이름을 가져 오는 방법의 예입니다. 함수에서 수행하고자하는 작업에 대한 자세한 내용을 제공하면 그 이름이 필요합니다. 아마도 다른 것을 제안 할 수 있습니다.

import inspect 
def somefunc(a,b,c): 
    print "My name is: %s" % inspect.stack()[0][3] 

당신은 이것을 일반화 수 : Google을 통해 발견 된 Stefaan Lippens

def funcname(): 
    return inspect.stack()[1][3] 

def somefunc(a,b,c): 
    print "My name is: %s" % funcname() 

신용

+2

구현 세부 정보에 의존하는 데 데코레이터를 사용하는 경우 +1 –

+1

@MatthewTrevor 솔직하게 구현 세부 사항에 의존하는 데코레이터를 참조하십시오. http://stackoverflow.com/questions/251464/how-to-get-a-function-name-as-a-string-in-python에 따르면'.func_name'을 통해'.__ name__'을 사용하는 것이 좋습니다. . 나는 기본 생각에 동의한다. –

53

이 모듈 inspect를 사용하여 간단한 방법이 될 것으로 보인다.

+0

오타 : 이름은 "Stefaan"이어야합니다. 링크가 오래되었고 제대로 작동하지 않습니다. "http://stefaanlippens.net/python_inspect"를 시도하십시오. –

10
# file "foo.py" 
import sys 
import os 

def LINE(back = 0): 
    return sys._getframe(back + 1).f_lineno 
def FILE(back = 0): 
    return sys._getframe(back + 1).f_code.co_filename 
def FUNC(back = 0): 
    return sys._getframe(back + 1).f_code.co_name 
def WHERE(back = 0): 
    frame = sys._getframe(back + 1) 
    return "%s/%s %s()" % (os.path.basename(frame.f_code.co_filename),  
          frame.f_lineno, frame.f_code.co_name) 

def testit(): 
    print "Here in %s, file %s, line %s" % (FUNC(), FILE(), LINE()) 
    print "WHERE says '%s'" % WHERE() 

testit() 

출력 :

$ python foo.py 
Here in testit, file foo.py, line 17 
WHERE says 'foo.py/18 testit()' 

사용 "다시 = 1"두 가지 수준의 다시 스택 다운에 대한 정보를 찾을 수있는 등 inspect 등을 통해 자기 반성을 포함

관련 문제