Coverage for python/lsst/utils/get_caller_name.py : 10%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1#
2# Developed for the LSST Data Management System.
3# This product includes software developed by the LSST Project
4# (https://www.lsst.org).
5# See the COPYRIGHT file at the top-level directory of this distribution
6# for details of code ownership.
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <https://www.gnu.org/licenses/>.
20#
22import inspect
24__all__ = ["get_caller_name"]
27def get_caller_name(skip=2):
28 """Get the name of the caller method.
30 Any item that cannot be determined (or is not relevant, e.g. a free
31 function has no class) is silently omitted, along with an
32 associated separator.
34 Parameters
35 ----------
36 skip : `int`
37 How many levels of stack to skip while getting caller name;
38 1 means "who calls me", 2 means "who calls my caller", etc.
40 Returns
41 -------
42 name : `str`
43 Name of the caller as a string in the form ``module.class.method``.
44 An empty string is returned if ``skip`` exceeds the stack height.
46 Notes
47 -----
48 Adapted from from http://stackoverflow.com/a/9812105
49 by adding support to get the class from ``parentframe.f_locals['cls']``
50 """
51 stack = inspect.stack()
52 start = 0 + skip
53 if len(stack) < start + 1:
54 return ''
55 parentframe = stack[start][0]
57 name = []
58 module = inspect.getmodule(parentframe)
59 if module:
60 name.append(module.__name__)
61 # add class name, if any
62 if 'self' in parentframe.f_locals:
63 name.append(type(parentframe.f_locals['self']).__name__)
64 elif 'cls' in parentframe.f_locals:
65 name.append(parentframe.f_locals['cls'].__name__)
66 codename = parentframe.f_code.co_name
67 if codename != '<module>': # top level usually
68 name.append(codename) # function or a method
69 return ".".join(name)