Joa*_*nge 110 python debugging
如果你有两个功能,如:
def A
def B
Run Code Online (Sandbox Code Playgroud)
和A打电话给B,你能得到谁在B里面叫B,比如:
def A () :
B ()
def B () :
this.caller.name
Run Code Online (Sandbox Code Playgroud)
Aym*_*ieh 167
您可以使用inspect模块获取所需的信息.它的堆栈方法返回一个帧记录列表.
对于Python 2,每个帧记录都是一个列表.每条记录中的第三个元素是调用者名称.你想要的是这个:
>>> import inspect
>>> def f():
... print inspect.stack()[1][3]
...
>>> def g():
... f()
...
>>> g()
g
Run Code Online (Sandbox Code Playgroud)对于Python 3.5+,每个帧记录都是一个命名元组,因此您需要替换
print inspect.stack()[1][3]
Run Code Online (Sandbox Code Playgroud)
同
print(inspect.stack()[1].function)
Run Code Online (Sandbox Code Playgroud)
在上面的代码.
Eri*_*ric 22
有两种方式,使用sys和inspect模块:
sys._getframe(1).f_code.co_nameinspect.stack()[1][3]的stack()形式是以下可读并根据其实施,因为它调用sys._getframe(),见提取物inspect.py:
def stack(context=1):
"""Return a list of records for the stack above the caller's frame."""
return getouterframes(sys._getframe(1), context)
Run Code Online (Sandbox Code Playgroud)
Pio*_*sen 13
注意(2018年6月):今天,我可能会使用inspect模块,请参阅其他答案
sys._getframe(1).f_code.co_name 如下例所示:
>>> def foo():
... global x
... x = sys._getframe(1)
...
>>> def y(): foo()
...
>>> y()
>>> x.f_code.co_name
'y'
>>>
Run Code Online (Sandbox Code Playgroud)
重要提示:从_getframe方法名称中可以明显看出(嘿,它以下划线开头),它不是一种应该不加思索地依赖的API方法.
这适合我!:d
>>> def a():
... import sys
... print sys._getframe(1).f_code.co_name
...
>>> def b():
... a()
...
...
>>> b()
b
>>>
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用日志记录模块并在 BaseConfig() 中指定 %(funcName)s 选项
import logging
logging.basicConfig(filename='/tmp/test.log', level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(funcName)s |%(message)s')
def A():
logging.info('info')
Run Code Online (Sandbox Code Playgroud)