如何将函数名转换为字符串?
我怎么才能把一个函数的名字变成字符串呢?
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__
这个属性,所以你只需要记住一个特殊的名字。