如何将函数名转换为字符串?

1079 投票
14 回答
856238 浏览
提问于 2025-04-11 17:51

我怎么才能把一个函数的名字变成字符串呢?

def foo():
    pass

>>> name_of(foo)
"foo"

14 个回答

53

如果你对类的方法也感兴趣的话,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"
425

如果你想在一个函数或方法内部获取它的名字,可以考虑以下方法:

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,它可能会提示你一个错误:

错误:项 "None" 的 "Optional[FrameType]" 没有属性 "f_code"

要消除这个错误,可以考虑:

import inspect
import types
from typing import cast

this_function_name = cast(types.FrameType, inspect.currentframe()).f_code.co_name
1371
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__ 这个属性,所以你只需要记住一个特殊的名字。

撰写回答