함수 이름을 문자열로 가져오려면 어떻게 해야 합니까?
함수 이름을 문자열로 가져오려면 어떻게 해야 합니까?
def foo():
pass
>>> name_of(foo)
"foo"
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__
Atribute도 기억하기 때문에 특별한 이름 하나만 기억하면 됩니다.
현재 함수 또는 메서드의 이름을 함수 내부에서 가져오려면 다음을 고려하십시오.
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)
코드를 거의 사람이 읽을 수 있는 형식으로 표시합니다.:)
클래스 메서드에도 관심이 있으시다면 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"
이 함수는 호출자의 함수 이름을 반환합니다.
def func_name():
import traceback
return traceback.extract_stack(None, 2)[0][2]
그것은 친절한 포장지로 Albert Vonpppp의 대답과 같다.
import inspect
def foo():
print(inspect.stack()[0][3])
어디에
stack()[0]
발신자stack()[3]
메서드의 문자열 이름입니다.
저는 기능성 데코레이터를 사용하는 것을 좋아합니다.수업도 추가했고, 그 시간은 함수 시간에 곱합니다.gLog가 표준 python 로거라고 가정합니다.
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
그래서 이제 당신이 할 일은 그것을 장식하고 voila만 하면 된다.
@func_timer_decorator
def my_func():
이 함수의 이름을 알고 싶을 뿐입니다.이것은 간단한 코드입니다.이러한 기능이 정의되어 있다고 합시다.
def function1():
print "function1"
def function2():
print "function2"
def function3():
print "function3"
print function1.__name__
출력은 function1이 됩니다.
이제 목록에 이러한 기능이 있다고 가정해 보겠습니다.
a = [function1 , function2 , funciton3]
함수의 이름을 알아내다
for i in a:
print i.__name__
출력은 다음과 같습니다.
기능 1
기능 2
기능 3
@Demyn의 답변의 연장선상에서 현재 함수의 이름과 현재 함수의 인수를 인쇄하는 유틸리티 함수를 만들었습니다.
import inspect
import logging
import traceback
def get_function_name():
return traceback.extract_stack(None, 2)[0][2]
def get_function_parameters_and_values():
frame = inspect.currentframe().f_back
args, _, _, values = inspect.getargvalues(frame)
return ([(i, values[i]) for i in args])
def my_func(a, b, c=None):
logging.info('Running ' + get_function_name() + '(' + str(get_function_parameters_and_values()) +')')
pass
logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
'%(asctime)s [%(levelname)s] -> %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)
my_func(1, 3) # 2016-03-25 17:16:06,927 [INFO] -> Running my_func([('a', 1), ('b', 3), ('c', None)])
sys._getframe()
Python의 모든 구현에서 사용할 수 있는 것은 아닙니다(참조 참조).traceback
모듈을 사용하여 동일한 작업을 수행합니다(예:
import traceback
def who_am_i():
stack = traceback.extract_stack()
filename, codeline, funcName, text = stack[-2]
return funcName
에의 문의stack[-1]
현재 프로세스 세부 정보가 반환됩니다.
나는 장식가들을 활용한 몇 가지 답변을 보았지만, 몇몇 답변은 다소 장황하게 느껴졌다.다음은 함수 이름과 각각의 입력 및 출력 값을 로깅하기 위해 사용하는 것입니다.로그 파일을 작성하는 것이 아니라, 정보를 인쇄하는 것만으로 수정해, OP 고유의 예에 적용하도록 했습니다.
def debug(func=None):
def wrapper(*args, **kwargs):
try:
function_name = func.__func__.__qualname__
except:
function_name = func.__qualname__
return func(*args, **kwargs, function_name=function_name)
return wrapper
@debug
def my_function(**kwargs):
print(kwargs)
my_function()
출력:
{'function_name': 'my_function'}
import inspect
def my_first_function():
func_name = inspect.stack()[0][3]
print(func_name) # my_first_function
또는 다음과 같이 입력합니다.
import sys
def my_second_function():
func_name = sys._getframe().f_code.co_name
print(func_name) # my_second_function
해라
import sys
fn_name = sys._getframe().f_code.co_name
자세한 내용은 https://www.oreilly.com/library/view/python-cookbook/0596001673/ch14s08.html를 참조해 주세요.
할 수 .__name__
★★★★★★ 。
def my_function():
pass
print(my_function.__name__) # prints "my_function"
언급URL : https://stackoverflow.com/questions/251464/how-to-get-a-function-name-as-a-string
'source' 카테고리의 다른 글
빈 결과 확인(PHP, PDO 및 MySQL) (0) | 2022.09.08 |
---|---|
문자열에서 하위 문자열의 마지막 항목 색인 찾기 (0) | 2022.09.08 |
vuex에서의 mapState, mapGetters, mapActions, mapMetations의 차이점 (0) | 2022.09.08 |
'for' 루프를 사용하여 사전을 통해 반복 (0) | 2022.09.08 |
Mac OS에서 MySQL의 innodb_buffer_pool_size 값을 변경하려면 어떻게 해야 합니까? (0) | 2022.09.08 |