博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在python中获取当前位置所在的行号和函数名
阅读量:7013 次
发布时间:2019-06-28

本文共 3917 字,大约阅读时间需要 13 分钟。

  hot3.png

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

%(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_backdef 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"):        co = f.f_code        filename = os.path.normcase(co.co_filename)        if filename == _srcfile:            f = f.f_back            continue        rv = (co.co_filename, f.f_lineno, co.co_name)        break    return rvdef _log(self, level, msg, args, exc_info=None, extra=None):    """    Low-level logging routine which creates a LogRecord and then calls    all the handlers of this logger to handle the record.    """    if _srcfile:        #IronPython doesn't track Python frames, so findCaller throws an        #exception on some versions of IronPython. We trap it here so that        #IronPython can use logging.        try:            fn, lno, func = self.findCaller()        except ValueError:            fn, lno, func = "(unknown file)", 0, "(unknown function)"    else:        fn, lno, func = "(unknown file)", 0, "(unknown function)"    if exc_info:        if not isinstance(exc_info, tuple):            exc_info = sys.exc_info()    record = self.makeRecord(self.name, level, fn, lno, msg, args, exc_info, func, extra)    self.handle(record)

实际上是通过在currentframe函数中抛出一个异常,然后通过向上查找的方式,找到调用的信息。其中

rv = (co.co_filename, f.f_lineno, co.co_name)

的三个值分别为文件名,行号,函数名。(可以去http://docs.python.org/library/sys.html来看一下代码中几个系统函数的说明)

OK,如果已经看懂了源码,那获取当前位置的行号和函数名相信也非常清楚了,代码如下:

#!/usr/bin/python# -*- coding: utf-8 -*-#  Description:     获取当前位置的行号和函数名import sysdef get_cur_info():    """Return the frame object for the caller's stack frame."""    try:        raise Exception    except:        f = sys.exc_info()[2].tb_frame.f_back    return (f.f_code.co_name, f.f_lineno)def callfunc():    print get_cur_info()if __name__ == '__main__':    callfunc()

输入结果是:

('callfunc', 24)

符合预期~~
哈哈,OK!现在应该不用再抱怨取不到行号和函数名了吧~
=============================================================================
后来发现,其实也可以有更简单的方法,如下:

import sysdef get_cur_info():    print sys._getframe().f_code.co_name    print sys._getframe().f_back.f_code.co_nameget_cur_info()

调用结果是:

 

get_cur_info

转载于:https://my.oschina.net/yehun/blog/870911

你可能感兴趣的文章
Vue2---父子组件之间的访问
查看>>
重新想象 Windows 8 Store Apps (41) - 打印
查看>>
100%布局的头部,内部内容960居中出现滚动条的时候,注意的小东西
查看>>
Ubuntu系统里下载安装配置redis-2.2.13.tar.gz
查看>>
2017年PHP程序员未来路在何方
查看>>
vue - webpack.base.conf.js
查看>>
MongoDB 主从复制小实验
查看>>
Linux Shell常用技巧(七)
查看>>
iOS网络编程解析协议二:XML数据传输解析
查看>>
Leetcode: Concatenated Words
查看>>
Python 多线程
查看>>
oracle数据库性能
查看>>
关于VS中的调试信息输出
查看>>
IOS-5个可以帮你优化App的优秀网站
查看>>
ArrayIndexOutOfBoundsException
查看>>
JAVA判断各种类型数据是否为空
查看>>
如何使用kali的Searchsploit查找软件漏洞
查看>>
Vim for Rails developers: Lazy modern configuration
查看>>
小鹏G3完成两轮三高测试 夏珩:该走的路我们一步不少走
查看>>
西班牙多地拉响“黄色大风”警报 华人出行需谨慎
查看>>