天天看点

inspect模块小技巧

一、如何在运行时获取文件路径

#-*- coding:utf-8 -*-
import os
import inspect
#获取当前frame对象
current_frame = inspect.stack()[0][0]
try:
	#文件名
	filename = inspect.getfile(current_frame)
	filepath = os.path.abspath(filename)
	print filepath
except Exception, e:
	raise e
finally:
	#删除reference cycles,避免内存浪费
	del current_frame
           

二、如何实现主函数装饰器

#-*-encoding:utf-8-*-#
"""
main_decorator.py
"""
import sys
import inspect

def main(fn):
    """
    装饰器,用来标识模块的主函数。
    @main
    def mymain_function():
        # function body
    
    该函数用来取代 if __name__ == '__main__' 语句。
    """
    caller_frame = inspect.stack()[1][0]
    try:
        if caller_frame.f_locals['__name__'] == '__main__':
            args = sys.argv[1:]
            fn(*args)
    except Exception, e:
        raise e
    finally:
        del caller_frame
           
#-*- encoding:utf-8 -*-
from main_decorator import main

@main
def hello_main_decorator():
	print 'hello main decorator!'
           

三、inspect模块备忘

  inspect模块能够在运行时获取对象(live objects)的信息。该模块主要提供四种类型的服务——类型核对、源代码获取、检阅类和函数以及检查解析器栈信息,它对获取运行时信息提供了很好的支持。