HOWTO · Python
在 Python 中获取函数名
它演示了如何在 Python 中输出一个函数名。
本页内容
获取函数名时,读取它的 __name__ 属性即可,无需调用函数:function.__name__ 会返回一个字符串。若需要了解函数所在的词法上下文,请使用 __qualname__;只有在需要获取当前正在运行的函数信息时,才检查调用帧。
使用 __name__ 获取函数名
函数对象通过 __name__ 属性提供简短名称。下面的示例定义两个函数并打印它们的名称;它不会调用这两个函数。
def greet():
return "Hello"
def farewell():
return "Goodbye"
print(greet.__name__)
print(farewell.__name__)
greet
farewell
内置函数和导入的函数也有这个属性。例如,print.__name__ 的值是 print,而 os.system.__name__ 的值是 system:
import os
print(print.__name__)
print(os.system.__name__)
print
system
这些表达式读取函数对象的属性,不会调用函数。将函数传给程序的其他部分或显示其名称时,这一区别很有用。
使用 __qualname__ 获取限定名称
__qualname__ 包含函数在所属作用域中的词法路径。它可以区分短名称 __name__ 相同的方法或嵌套函数。
class Report:
def render(self):
return "ready"
print(Report.render.__name__)
print(Report.render.__qualname__)
render
Report.render
对于这个方法,短名称是 render,限定名称是 Report.render。这两个属性都不是唯一标识符:不同模块中的两个函数可能具有相同的限定名称;将函数赋给另一个变量,也不会改变它声明时的名称。
如果要简洁地显示函数声明的名称,或根据该名称进行查找,请使用 __name__。如果所属类或嵌套作用域有助于说明所指的是哪个函数,请使用 __qualname__。二者都是函数对象的属性,因此引用函数时不需要加括号。
检查当前调用帧
如果代码确实需要获取当前正在执行的函数名称,可以通过 Python 的 inspect 模块取得当前帧,并读取其代码对象的 co_name。这是一种用于调试及相关工具的内省技术,通常不用于获取函数对象本身的名称。
import inspect
def current_function_name():
frame = inspect.currentframe()
if frame is None:
return None
return frame.f_code.co_name
print(current_function_name())
current_function_name
在不支持获取帧的 Python 实现中,inspect.currentframe() 可能返回 None。帧对象也可能保留对局部变量的引用,因此,如果检查后仍要持有帧引用,请及时释放。若可用,sys._getframe(0).f_code.co_name 是一种更底层的替代方式;由于名称以下划线开头,应将它视为依赖具体实现的接口,而不是可移植的命名 API。
选择合适的方法
- 要获取已知函数对象的简短名称,请使用
function.__name__。 - 如果显示的名称应包含嵌套作用域或类的上下文,请使用
function.__qualname__。 - 只有在需要了解当前正在执行的帧的信息(例如调试时),才使用
inspect.currentframe()或sys._getframe()。
通常,显示函数名时直接使用 __name__ 即可。上面的示例已成功运行,其输出展示了各表达式返回的名称。