inspect模塊提供了一系列函數用于幫助使用自省。下面僅列出較常用的一些函數,想獲得全部的函數資料可以查看inspect模塊的文檔。
1.檢查對象類型
is{module|class|function|method|builtin}(obj):
檢查對象是否為模塊、類、函數、方法、內建函數或方法。
isroutine(obj):
用于檢查對象是否為函數、方法、內建函數或方法等等可調用類型。用這個方法會比多個is*()更方便,不過它的實現仍然是用了多個is*()。
im=cat.sayHi
ifinspect.isroutine(im):
im()
對于實現了__call__的類實例,這個方法會返回False。如果目的是只要可以直接調用就需要是True的話,不妨使用isinstance(obj,collections.Callable)這種形式。我也不知道為什么Callable會在collections模塊中,抱歉!我猜大概是因為collections模塊中包含了很多其他的ABC(AbstractBaseClass)的緣故吧:)
2.獲取對象信息
getmembers(object[,predicate]):
這個方法是dir()的擴展版,它會將dir()找到的名字對應的屬性一并返回,形如[(name,value),...]。另外,predicate是一個方法的引用,如果指定,則應當接受value作為參數并返回一個布爾值,如果為False,相應的屬性將不會返回。使用is*作為第二個參數可以過濾出指定類型的屬性。
getmodule(object):
還在為第2節中的__module__屬性只返回字符串而遺憾嗎?這個方法一定可以滿足你,它返回object的定義所在的模塊對象。
get{file|sourcefile}(object):
獲取object的定義所在的模塊的文件名|源代碼文件名(如果沒有則返回None)。用于內建的對象(內建模塊、類、函數、方法)上時會拋出TypeError異常。
get{source|sourcelines}(object):
獲取object的定義的源代碼,以字符串|字符串列表返回。代碼無法訪問時會拋出IOError異常。只能用于module/class/function/method/code/frame/traceack對象。
getargspec(func):
僅用于方法,獲取方法聲明的參數,返回元組,分別是(普通參數名的列表,*參數名,**參數名,默認值元組)。如果沒有值,將是空列表和3個None。如果是2.6以上版本,將返回一個命名元組(NamedTuple),即除了索引外還可以使用屬性名訪問元組中的元素。
defadd(x,y=1,*z):
returnx+y+sum(z)
printinspect.getargspec(add)
#ArgSpec(args=['x','y'],varargs='z',keywords=None,defaults=(1,))
getargvalues(frame):
僅用于棧幀,獲取棧幀中保存的該次函數調用的參數值,返回元組,分別是(普通參數名的列表,*參數名,**參數名,幀的locals())。如果是2.6以上版本,將返回一個命名元組(NamedTuple),即除了索引外還可以使用屬性名訪問元組中的元素。
defadd(x,y=1,*z):
printinspect.getargvalues(inspect.currentframe())
returnx+y+sum(z)
add(2)
#ArgInfo(args=['x','y'],varargs='z',keywords=None,locals={'y':1,'x':2,'z':()})
getcallargs(func[,*args][,**kwds]):
返回使用args和kwds調用該方法時各參數對應的值的字典。這個方法僅在2.7版本中才有。
getmro(cls):
返回一個類型元組,查找類屬性時按照這個元組中的順序。如果是新式類,與cls.__mro__結果一樣。但舊式類沒有__mro__這個屬性,直接使用這個屬性會報異常,所以這個方法還是有它的價值的。
printinspect.getmro(Cat)
#(,)
printCat.__mro__
#(,)
classDog:pass
printinspect.getmro(Dog)
#(,)
printDog.__mro__#AttributeError
currentframe():
返回當前的棧幀對象。
以上內容為大家介紹了python之使用inspect模塊,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。