def get_stack_calls():
stack = []
currentframe = inspect.currentframe()
if currentframe is None:
return stack
try:
stackframes = inspect.getouterframes(currentframe)
except IndexError:
# ???????? ?????? Jinja2
stackframes = traceback.extract_stack()
for record in stackframes[2:]:
filename, lineno, funcname, line = record
if filename.startswith(BASE_PATTERN) and 'devserver' not in filename:
filename = filename[len(BASE_PATTERN):]
caller = '%s (func %r, line %s)' % (filename, funcname, lineno)
stack.append(caller)
else:
for record in stackframes[2:]:
frame, filename, lineno, funcname, lines, index = record
if filename in (TEMPLATE_BASE, TEMPLATE_DEBUG):
# ????? ?? ???????
node = frame.f_locals.get('node') or frame.f_locals.get('self')
if isinstance(node, Node):
loader = node.source[0]
offsets = node.source[1]
with open(loader.name, newline='') as source:
start = source.read(offsets[0])
line_num = start.count('\n') + 1
token = source.read(offsets[1] - offsets[0])
caller = '%s (node %r, line %s)' % (loader.loadname, token, line_num)
stack.append(caller)
break
elif filename.startswith(BASE_PATTERN) and 'devserver' not in filename:
# ????? ?? ????
filename = filename[len(BASE_PATTERN):]
caller = '%s (func %r, line %s)' % (filename, funcname, lineno)
stack.append(caller)
return reversed(stack)
评论列表
文章目录