나는 이것을 알아야만한다고 느낀다. 그러나 나는 그것을 이해할 수 없었다. ...파이썬 함수 또는 메서드 내에서 함수 또는 메서드의 이름을 얻으려면 어떻게해야합니까?
나는 내부에서부터 통합 테스트가 될 방법의 이름을 얻고 싶다. 진단 텍스트를 출력 할 수 있습니다. 물론 문자열의 메서드 이름을 하드 코딩 할 수도 있지만 가능하면 테스트를 좀 더 DRY로 만들고 싶습니다.
나는 이것을 알아야만한다고 느낀다. 그러나 나는 그것을 이해할 수 없었다. ...파이썬 함수 또는 메서드 내에서 함수 또는 메서드의 이름을 얻으려면 어떻게해야합니까?
나는 내부에서부터 통합 테스트가 될 방법의 이름을 얻고 싶다. 진단 텍스트를 출력 할 수 있습니다. 물론 문자열의 메서드 이름을 하드 코딩 할 수도 있지만 가능하면 테스트를 좀 더 DRY로 만들고 싶습니다.
나는 traceback
모듈이 당신이 찾고있는 것일 수도 있다고 생각합니다. 특히 extract_stack
함수는 작업을 수행하는 것처럼 보입니다.
이 데코레이터는 함수 내에서 사용할 수있는 메서드 이름을 키워드 인수로 전달합니다.
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()
신용
구현 세부 정보에 의존하는 데 데코레이터를 사용하는 경우 +1 –
@MatthewTrevor 솔직하게 구현 세부 사항에 의존하는 데코레이터를 참조하십시오. http://stackoverflow.com/questions/251464/how-to-get-a-function-name-as-a-string-in-python에 따르면'.func_name'을 통해'.__ name__'을 사용하는 것이 좋습니다. . 나는 기본 생각에 동의한다. –
이 모듈 inspect
를 사용하여 간단한 방법이 될 것으로 보인다.
오타 : 이름은 "Stefaan"이어야합니다. 링크가 오래되었고 제대로 작동하지 않습니다. "http://stefaanlippens.net/python_inspect"를 시도하십시오. –
# 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
등을 통해 자기 반성을 포함
가능한 [Python에서 함수 이름을 문자열로 가져 오는 방법은?] (http://stackoverflow.com/questions/251464/how-to-get-the-function-name-as-string-in- python) – DarenW
@DarenW 아니에요. 함수 객체를 포함하는 변수에서 함수 이름을 요청하고 함수 이름을 내부에서 요청하는 것은 두 가지 다른 질문입니다. –