通过inspect.getframeinfo
模块。我的意思是——在 Python 中没有直接的方法来做到这一点——大多数时候你可以在没有函数的情况下获得代码对象,它是通过帧内省。
Inspect 的 getframeinfo 函数确实会返回有关正在运行的帧的一些信息,然后您可以通过获取函数对象的名称来检索函数对象。
但这取决于实现并且有一些缺点:
>>> import inspect
>>> def a():
... return inspect.currentframe()
...
>>> inspect.getframeinfo(a())
Traceback(filename='<stdin>', lineno=2, function='a', code_context=None, index=None)
>>> b = inspect.getframeinfo(a())
>>> b.function
'a'
另一种方法,但仍然依赖于实现,是使用 gc 模块(垃圾收集器)来获取对所述代码对象的引用。
>>> import gc
>>> from types import FunctionType
>>> def a(): pass
...
>>> code = a.__code__
>>> [obj for obj in gc.get_referrers(code) if isinstance(obj, FunctionType) ][0]
<function a at 0x7f1ef4484500>
>>>
-- 这适用于 Python 3 - 对于 Python 2 应该替换__code__
为func_code