我如何得到一个函数的名字作为字符串?

def foo():
    pass

>>> name_of(foo)
"foo"

当前回答

我看到过一些使用装饰器的回答,尽管我觉得有些冗长。下面是我用来记录函数名以及它们各自的输入和输出值的东西。我在这里修改了它,只打印信息而不是创建日志文件,并将其应用于特定于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'}

其他回答

该函数将返回调用方的函数名。

def func_name():
    import traceback
    return traceback.extract_stack(None, 2)[0][2]

这就像Albert Vonpupp用友好的包装给出的答案。

my_function.func_name

函数还有其他有趣的属性。输入dir(func_name)来列出它们。func_name.func_code。Co_code是编译后的函数,存储为字符串。

import dis
dis.dis(my_function)

将以几乎人类可读的格式显示代码。:)

要从函数或方法中获取当前函数或方法的名称,考虑:

import inspect

this_function_name = inspect.currentframe().f_code.co_name

sys。_getframe也可以代替inspect。虽然后者避免访问私有函数。

要获得调用函数的名称,请考虑inspect.currentframe().f_back.f_code.co_name中的f_back。


如果也使用mypy,它可以抱怨:

选项"Optional[FrameType]"中的"None"没有属性"f_code"

为了抑制上述错误,考虑:

import inspect
import types
from typing import cast

this_function_name = cast(types.FrameType, inspect.currentframe()).f_code.co_name

如果你对类方法也感兴趣,Python 3.3+除了__name__还有__qualname__。

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"

我看到过一些使用装饰器的回答,尽管我觉得有些冗长。下面是我用来记录函数名以及它们各自的输入和输出值的东西。我在这里修改了它,只打印信息而不是创建日志文件,并将其应用于特定于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'}