programing

파이썬의 다른 함수 안에서 호출자 함수 이름을 가져오는 중?

javamemo 2023. 7. 19. 21:02
반응형

파이썬의 다른 함수 안에서 호출자 함수 이름을 가져오는 중?

다음과 같은 두 가지 기능이 있는 경우:

def A
def B

그리고 A가 B에게 전화를 걸면, B 안에서 누가 B에게 전화를 걸었는지 알 수 있습니까?

def A () :
    B ()

def B () :
    this.caller.name

검사 모듈을 사용하여 원하는 정보를 얻을 수 있습니다.스택 메서드는 프레임 레코드 목록을 반환합니다.

  • Python 2의 경우 각 프레임 레코드는 목록입니다.각 레코드의 세 번째 요소는 발신자 이름입니다.원하는 것은 다음과 같습니다.

    >>> import inspect
    >>> def f():
    ...     print inspect.stack()[1][3]
    ...
    >>> def g():
    ...     f()
    ...
    >>> g()
    g
    

  • Python 3.5+의 경우 각 프레임 레코드는 이름이 지정된 튜플이므로 교체해야 합니다.

    print inspect.stack()[1][3]
    

    와 함께

    print(inspect.stack()[1].function)
    

    상술한 규정에 의하여

다음과 같은 두 가지 방법이 있습니다.sys그리고.inspect모듈:

  • sys._getframe(1).f_code.co_name
  • inspect.stack()[1][3]

stack()폼의 판독성이 떨어지며 호출하기 때문에 구현에 종속됩니다.sys._getframe()에서 발췌를 보다.inspect.py:

def stack(context=1):
    """Return a list of records for the stack above the caller's frame."""
    return getouterframes(sys._getframe(1), context)

참고(2018년 6월): 오늘은 아마도inspect모듈, 다른 답변 참조

sys._getframe(1).f_code.co_name아래의 예와 같이:

>>> def foo():
...  global x
...  x = sys._getframe(1)
...
>>> def y(): foo()
...
>>> y()
>>> x.f_code.co_name
'y'
>>>  

중요한 참고: 그것은 명백하기 때문입니다._getframe메서드 이름(하이, 밑줄로 시작함), 아무 생각 없이 의존해야 하는 API 메서드가 아닙니다.

이것은 나에게 효과가 있습니다! :d

>>> def a():
...     import sys
...     print sys._getframe(1).f_code.co_name
...
>>> def b():
...     a()
...
...
>>> b()
b
>>>

로깅 모듈을 사용하고 BaseConfig()에서 %(funcName)s 옵션을 지정할 수 있습니다.

import logging
logging.basicConfig(
    filename='/tmp/test.log', 
    level=logging.DEBUG, 
    format='%(asctime)s | %(levelname)s | %(funcName)s |%(message)s',
)

def A():
    logging.info('info')

언급URL : https://stackoverflow.com/questions/900392/getting-the-caller-function-name-inside-another-function-in-python

반응형