トレースバックは複数行の関数呼び出しを処理しませんか?
多くの関数は、数十行または (恐ろしい) 数百行の長さです。トレースバックが関数全体を出力した場合、スタック トレースは理解できないほど長くなります。ですから、あなたが見ているのは、物事をクリーンで最小限に保つための試みだと思います.
同様の質問に対するいくつかの回答をまとめました。
inspect は関数全体のソースしか取得できないことを考慮して (ソースがパス上で利用可能な場合)、これを提供できます。
import traceback
import inspect
import gc
def giveupthefunc(frame):
code = frame.f_code
globs = frame.f_globals
functype = type(lambda: 0)
funcs = []
for func in gc.get_referrers(code):
if type(func) is functype:
if getattr(func, "func_code", None) is code:
if getattr(func, "func_globals", None) is globs:
funcs.append(func)
if len(funcs) > 1:
return None
return funcs[0] if funcs else None
def AssertTrue(expr, reason=None):
print traceback.format_stack()[-2]
frame = inspect.currentframe().f_back
func = giveupthefunc(frame)
if func:
source = inspect.getsourcelines(func)
i = source[1]
for line in source[0]:
print i, ":", line,
i += 1
def my_fun():
AssertTrue(1 == 2,
reason='One is not equal to two')
my_fun()
生成するもの:
/Library/Frameworks/Python.framework/Versions/2.7/bin/python /Users/xxxx/Documents/PycharmProjects/scratchpad/test.py
File "/Users/xxxx/Documents/PycharmProjects/scratchpad/test.py", line 35, in my_fun
reason='One is not equal to two')
33 : def my_fun():
34 : AssertTrue(1 == 2,
35 : reason='One is not equal to two')