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

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

  • 1.python中没办法直接取得当前的行号和函数名。这是有人在论坛里提出的问题,底下一群人只是在猜测python为什么不像__file__一样提供__line__和__func__,但是却最终也没有找到解决方案。
  • 2.如果一个函数在不知道自己名字的情况下,怎么才能递归调用自己。这是我一个同事问我的,其实也是获取函数名,但是当时也是回答不出来。

但是今晚!所有的问题都有了答案。
一切还要从我用python的logging模块说起,logging中的format中是有如下选项的:

也就是说,logging是能够获取到调用者的行号和函数名的,那会不会也可以获取到自己的行号和函数名呢?
我们来看一下源码,主要部分如下:

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

的三个值分别为文件名,行号,函数名。(可以去http://docs.python.org/library/sys.html来看一下代码中几个系统函数的说明)
OK,如果已经看懂了源码,那获取当前位置的行号和函数名相信也非常清楚了,代码如下:

输入结果是:

符合预期~~
哈哈,OK!现在应该不用再抱怨取不到行号和函数名了吧~

=============================================================================
后来发现,其实也可以有更简单的方法,如下:

调用结果是:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要打印号和函数名,可以使用预定义的宏 __LINE__ 和 __FUNCTION__。例如: printf("Line %d in function %s\n", __LINE__, __FUNCTION__); 这将打印出当前号和函数名。 ### 回答2: 在C语言,要打印号和函数名,可以使用预定义的宏 __LINE__ 和 __func__。 __LINE__ 是一个宏,用于获取当前代码数。我们可以在需要打印号的地方使用 printf 或其他输出函数,以字符串形式输出 __LINE__,即可打印出当前号。 __func__ 也是一个宏,用于获取当前所在的函数名。同样地,在需要打印函数名的地方使用 printf 或其他输出函数,以字符串形式输出 __func__,就可以打印出当前函数的名字。 下面是一个简单的示例代码: ```c #include <stdio.h> void printInfo() { printf("号:%d\n", __LINE__); printf("函数名:%s\n", __func__); } int main() { printInfo(); return 0; } ``` 运上述代码,将会输出: ``` 号:5 函数名:printInfo ``` 这样我们就能够方便地打印出号和函数名,以便进调试或日志记录。 ### 回答3: 要在C语言打印号和函数名,可以使用预处理器的`__LINE__`和`__FUNCTION__`宏。`__LINE__`会在编译时自动将其替换为当前数,而`__FUNCTION__`会在编译时自动将其替换为当前函数名。 以下是一个示例代码: ```c #include <stdio.h> #define PRINT_LINE_AND_FUNCTION printf("Line: %d, Function: %s\n", __LINE__, __FUNCTION__) void foo() { PRINT_LINE_AND_FUNCTION; } int main() { PRINT_LINE_AND_FUNCTION; foo(); return 0; } ``` 在上述代码,我们定义了一个名为`PRINT_LINE_AND_FUNCTION`的宏,它使用`printf`函数号和函数名打印到控制台。然后,在`main`函数和`foo`函数,我们分别调用了`PRINT_LINE_AND_FUNCTION`宏来打印号和函数名。 运以上代码,输出结果将是: ``` Line: 11, Function: main Line: 6, Function: foo ``` 这样我们就可以在程序轻松打印出号和函数名,以便于调试和定位问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值