如何将函数名称作为字符串获取?

2022-09-05 01:11:45

如何将函数的名称作为字符串获取?

def foo():
    pass

>>> name_of(foo)
"foo"

答案 1
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__


答案 2

若要从内部获取当前函数或方法的名称,请考虑:

import inspect

this_function_name = inspect.currentframe().f_code.co_name

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

要改为获取调用函数的名称,请考虑如 中所示。f_backinspect.currentframe().f_back.f_code.co_name


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

错误:“可选[框架类型]”的项目“无”没有属性“f_code”

要抑制上述错误,请考虑:

import inspect
import types
from typing import cast

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