Source code for utool._internal.meta_util_dbg

# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function, unicode_literals
import inspect
from os.path import split, splitext, dirname, basename


[docs]def get_stack_frame(N=0, strict=True): frame_level0 = inspect.currentframe() frame_cur = frame_level0 for _ix in range(N + 1): frame_next = frame_cur.f_back if frame_next is None: if strict: raise AssertionError('Frame level %r is root' % _ix) else: break frame_cur = frame_next return frame_cur
[docs]def get_caller_lineno(N=0, strict=True): parent_frame = get_stack_frame(N=N + 1, strict=strict) lineno = parent_frame.f_lineno return lineno
[docs]def get_caller_name(N=0, strict=True): """ Standalone version of get_caller_name """ if isinstance(N, (list, tuple)): name_list = [] for N_ in N: try: name_list.append(get_caller_name(N_)) except AssertionError: name_list.append('X') return '[' + ']['.join(name_list) + ']' # <get_parent_frame> parent_frame = get_stack_frame(N=N + 2, strict=strict) # </get_parent_frame> caller_name = parent_frame.f_code.co_name if caller_name == '<module>': co_filename = parent_frame.f_code.co_filename caller_name = splitext(split(co_filename)[1])[0] if caller_name == '__init__': co_filename = parent_frame.f_code.co_filename caller_name = basename(dirname(co_filename)) + '.' + caller_name return caller_name