Python 获取当前位置所在的函数名和行号
C/C++程序调试中经常用到的几个宏:__FILE__、__FUNCTION__、__LINE__
Python程序遇到问题调试时也想用下这种方式,找了下网上资料,发现这个问题还有不少人问
Python中获取当前位置所在的函数名和行号,都封装在sys中,获取方法如下:
import sys
def get_cur_info():
print sys._getframe().f_code.co_filename # 当前文件名,可以通过__file__获得
print sys._getframe().f_code.co_name # 当前函数名
print sys._getframe().f_lineno # 当前行号
get_cur_info()
其他函数请参考:dir(sys._getframe()).
本文主要介绍了python 动态获取当前运行的类名和函数名的方法,
分别介绍使用内置方法、sys模块、修饰器、inspect模块等方法。
一、使用内置方法和修饰器方法获取类名、函数名
python中获取函数名的情况分为内部、外部
1、从函数外部获取函数名
使用指向函数的对象,然后用__name__属性
def a():
pass
a.__name__
除此之外还可以:
getattr(a,'__name__')
a.__getattribute__('__name__')
完整示例:
def a():
print("hello, l love u")
print(a.__name__)
print(a.__getattribute__('__name__'))
print(getattr(a,'__name__'))
尽管有些脱裤子放屁,总之,从外部获取的方法是非常灵活的。
2、从函数内部获取函数名
需要用些技巧
1)使用sys模块的方法:(推荐)
def a():
print sys._getframe().f_code.co_name
f_code 和 co_name 可以参考python源码解析的pyc生成和命名空间章节。
2)使用修饰器的方法:(推荐)
使用修饰器就可以对函数指向一个变量,然后取变量对象的__name__方法。
def timeit(func):
def run(*argv):
print func.__name__
if argv:
ret = func(*argv)
else:
ret = func()
return ret
return run
@timeit
def t(a):
print a
t(1)
修饰器的改进版:
使用修饰器就可以对函数指向一个变量,然后取变量对象的__name__方法。
def get_name(func):
def warper(*args, **kwargs):
print("the function name is {}".format(func.__name__))
result = func(*args, **kwargs)
return result
return warper
@