파이썬에서 함수를 호출하지 않고 어떻게 함수 이름을 문자열로 얻습니까?
def my_function():
pass
print get_function_name_as_string(my_function) # my_function is not in quotes
출력해야합니다 "my_function"
.
파이썬에서 그러한 기능을 사용할 수 있습니까? 그렇지 않다면 get_function_name_as_string
파이썬에서 구현 방법에 대한 아이디어가 있습니까?
답변
my_function.__name__
사용은 __name__
균일하게 적용되는 바람직한 방법이다. 와 달리 func_name
내장 함수에서도 작동합니다.
>>> import time
>>> time.time.func_name
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'builtin_function_or_method' object has no attribute 'func_name'
>>> time.time.__name__
'time'
또한 이중 밑줄은 독자에게 이것이 특별한 속성임을 나타냅니다. 보너스로 클래스와 모듈에도 __name__
속성이 있으므로 하나의 특별한 이름 만 기억합니다.
답변
현재 함수 또는 메소드 이름을 내부에서 가져 오려면 다음을 고려하십시오.
import inspect
this_function_name = inspect.currentframe().f_code.co_name
sys._getframe
inspect.currentframe
후자는 개인 기능에 대한 액세스를 피하지만 대신 작동 합니다.
대신 호출 함수의 이름을 얻으려면 다음 f_back
과 같이 고려하십시오 inspect.currentframe().f_back.f_code.co_name
.
를 사용하는 경우 다음 mypy
과 같이 불평 할 수 있습니다.
오류 : “선택 사항 [FrameType]”의 “없음”항목에 “f_code”속성이 없습니다.
위의 오류를 억제하려면 다음을 고려하십시오.
import inspect
import types
from typing import cast
this_function_name = cast(types.FrameType, inspect.currentframe()).f_code.co_name
답변
my_function.func_name
함수의 다른 재미있는 속성도 있습니다. 입력 dir(func_name)
하여 입력 하십시오. func_name.func_code.co_code
컴파일 된 함수이며 문자열로 저장됩니다.
import dis
dis.dis(my_function)
의 코드가 표시됩니다 거의 사람이 읽을 수있는 형식을. 🙂
답변
이 함수는 호출자의 함수 이름을 반환합니다.
def func_name():
import traceback
return traceback.extract_stack(None, 2)[0][2]
친절한 래퍼에 대한 Albert Vonpupp의 답변과 같습니다.
답변
클래스 메소드에 관심이 있다면 Python 3.3 이상 __qualname__
에 추가하십시오 __name__
.
def my_function():
pass
class MyClass(object):
def method(self):
pass
print(my_function.__name__) # gives "my_function"
print(MyClass.method.__name__) # gives "method"
print(my_function.__qualname__) # gives "my_function"
print(MyClass.method.__qualname__) # gives "MyClass.method"
답변
함수 데코레이터를 사용하는 것이 좋습니다. 함수 시간을 곱한 클래스를 추가했습니다. gLog가 표준 파이썬 로거라고 가정합니다.
class EnterExitLog():
def __init__(self, funcName):
self.funcName = funcName
def __enter__(self):
gLog.debug('Started: %s' % self.funcName)
self.init_time = datetime.datetime.now()
return self
def __exit__(self, type, value, tb):
gLog.debug('Finished: %s in: %s seconds' % (self.funcName, datetime.datetime.now() - self.init_time))
def func_timer_decorator(func):
def func_wrapper(*args, **kwargs):
with EnterExitLog(func.__name__):
return func(*args, **kwargs)
return func_wrapper
이제 기능과 관련된 모든 것은 장식하고 짜는 것입니다.
@func_timer_decorator
def my_func():
답변
sys._getframe()
파이썬의 모든 구현에서 사용 가능한 것은 아닙니다 ( ref 참조 ) traceback
. 예를 들어 모듈을 사용 하여 같은 일을 할 수 있습니다 .
import traceback
def who_am_i():
stack = traceback.extract_stack()
filename, codeline, funcName, text = stack[-2]
return funcName
에 대한 호출 stack[-1]
은 현재 프로세스 세부 사항을 리턴합니다.