天天看點

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)的資訊。該子產品主要提供四種類型的服務——類型核對、源代碼擷取、檢閱類和函數以及檢查解析器棧資訊,它對擷取運作時資訊提供了很好的支援。