web-dev-qa-db-ja.com

pythonでその関数内の現在の関数名を取得する方法

私のロギング目的で、コードが入っている関数のすべての名前をログに記録したい

誰が関数を呼び出しているかは関係ありません。この行を宣言する関数名が必要です。

import inspect

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

def foo():
    print(whoami())

現在はfooを出力します。whoamiを出力します

13
John Kaff

あなたはおそらく inspect.getframeinfo(frame).function

import inspect

def whoami(): 
    frame = inspect.currentframe()
    return inspect.getframeinfo(frame).function

def foo():
    print(whoami())

foo()

プリント

whoami
20
user707650

私のロギング目的で、コードが入っている関数のすべての名前をログに記録したい

デコレーターを検討しましたか?

import functools
def logme(f):
    @functools.wraps(f)
    def wrapped(*args, **kwargs):
        print(f.__name__)
        return f(*args, **kwargs)
    return wrapped


@logme
def myfunction();
    print("Doing some stuff")
10
Eric

実際、これがloggingの場合、Ericの回答は道を示しています。

私のロギング目的で、コードが入っている関数のすべての名前をログに記録したい

関数名 を記録するようにフォーマッタを調整できます。

import logging               

def whoami():
    logging.info("Now I'm there")

def foo():
    logging.info("I'm here")
    whoami()
    logging.info("I'm back here again")

logging.basicConfig(
    format="%(asctime)-15s [%(levelname)s] %(funcName)s: %(message)s",
    level=logging.INFO)
foo()

プリント

2015-10-16 16:29:34,227 [INFO] foo: I'm here
2015-10-16 16:29:34,227 [INFO] whoami: Now I'm there
2015-10-16 16:29:34,227 [INFO] foo: I'm back here again
10
user707650

sys._getframe()によって返されるスタックフレームの_f_code.co_name_メンバーを使用します。

_sys._getframe(0).f_code.co_name
_

たとえば、whoami()関数では、

_import sys

def whoami(): 
    return sys._getframe(1).f_code.co_name

def func1():
    print(whoami())

func1()  # prints 'func1'
_
2