现在的位置: 首页 > 综合 > 正文

在python中获取当前位置所在的行号和函数名

2018年04月12日 ⁄ 综合 ⁄ 共 2111字 ⁄ 字号 评论关闭

2011-04-06 15:28:33 分类: python  标签: |字号 订阅

对于python,这几天一直有两个问题在困扰我:


1.python中没办法直接取得当前的行号和函数名。这是有人在论坛里提出的问题,底下一群人只是在猜测python为什么不像__file__一样提供__line__和__func__,但是却最终也没有找到解决方案。 

2.如果一个函数在不知道自己名字的情况下,怎么才能递归调用自己。这是我一个同事问我的,其实也是获取函数名,但是当时也是回答不出来。

但是今晚!所有的问题都有了答案。

一切还要从我用python的logging模块说起,logging中的format中是有如下选项的:


%(name)s            Name of the logger (logging channel)

%(levelno)s         Numeric logging level for the message (DEBUG, INFO,

                    WARNING, ERROR, CRITICAL)

%(levelname)s       Text logging level for the message ("DEBUG", "INFO",

                    "WARNING", "ERROR", "CRITICAL")

%(pathname)s        Full pathname of the source file where the logging

                    call was issued (if available)

%(filename)s        Filename portion of pathname

%(module)s          Module (name portion of filename)

%(lineno)d          Source line number where the logging call was issued

                    (if available)

%(funcName)s        Function name

%(created)f         Time when the LogRecord was created (time.time()

                    return value)

%(asctime)s         Textual time when the LogRecord was created

%(msecs)d           Millisecond portion of the creation time

%(relativeCreated)d Time in milliseconds when the LogRecord was created,

                    relative to the time the logging module was loaded

                    (typically at application startup time)

%(thread)d          Thread ID (if available)

%(threadName)s      Thread name (if available)

%(process)d         Process ID (if available)

%(message)s         The result of record.getMessage(), computed just as

                    the record is emitted也就是说,logging是能够获取到调用者的行号和函数名的,那会不会也可以获取到自己的行号和函数名呢?

我们来看一下源码,主要部分如下:


def currentframe():

    """Return the frame object for the caller's stack frame."""

    try:

        raise Exception

    except:

        return sys.exc_info()[2].tb_frame.f_back

def findCaller(self):

    """

    Find the stack frame of the caller so that we can note the source

    file name, line number and function name.

    """

    f = currentframe()

    #On some versions of IronPython, currentframe() returns None if

    #IronPython isn't run with -X:Frames.

    if f is not None:

        f = f.f_back

    rv = "(unknown file)", 0, "(unknown function)"

    while hasattr(f, "f_code"):

抱歉!评论已关闭.