關於python中inspect模塊的一些探究
標籤: Python
前言
我在學習到實戰Day5 - python教程 - 廖雪峯的官方網站時,遇到了inspect模塊,之前對這個inspect模塊一無所知啊,所以本着打破砂鍋問到底的精神,決定對inspect模塊做一些探究。
根據度娘搜到的,inspect模塊主要提供了四種用處:
(1). 對是否是模塊,框架,函數等進行類型檢查。
(2). 獲取源碼
(3). 獲取類或函數的參數的信息
(4). 解析堆棧
我在這次課程中,只用到了第三種用處,即獲取類或函數的參數的信息,下面我來探究一下。
探究
結合我正在學習的課程,我自己也對inspect做了一些探究。根據在課程中用到的一些函數及方法,我做了一個python腳本。
# test
import inspect
def a(a, b=0, *c, d, e=1, **f):
pass
aa = inspect.signature(a)
print("inspect.signature(fn)是:%s" % aa)
print("inspect.signature(fn)的類型:%s" % (type(aa)))
print("\n")
bb = aa.parameters
print("signature.paramerters屬性是:%s" % bb)
print("ignature.paramerters屬性的類型是%s" % type(bb))
print("\n")
for cc, dd in bb.items():
print("mappingproxy.items()返回的兩個值分別是:%s和%s" % (cc, dd))
print("mappingproxy.items()返回的兩個值的類型分別是:%s和%s" % (type(cc), type(dd)))
print("\n")
ee = dd.kind
print("Parameter.kind屬性是:%s" % ee)
print("Parameter.kind屬性的類型是:%s" % type(ee))
print("\n")
gg = dd.default
print("Parameter.default的值是: %s" % gg)
print("Parameter.default的屬性是: %s" % type(gg))
print("\n")
ff = inspect.Parameter.KEYWORD_ONLY
print("inspect.Parameter.KEYWORD_ONLY的值是:%s" % ff)
print("inspect.Parameter.KEYWORD_ONLY的類型是:%s" % type(ff))
執行以上腳本,將得到如下輸出:
inspect.signature(fn)是:(a, b=0, *c, d, e=1, **f)
inspect.signature(fn)的類型:<class 'inspect.Signature'>
signature.paramerters屬性是:OrderedDict([('a', <Parameter "a">), ('b', <Parameter "b=0">), ('c', <Parameter "*c">), ('d', <Parameter "d">), ('e', <Parameter "e=1">), ('f', <Parameter "**f">)])
ignature.paramerters屬性的類型是<class 'mappingproxy'>
mappingproxy.items()返回的兩個值分別是:a和a
mappingproxy.items()返回的兩個值的類型分別是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind屬性是:POSITIONAL_OR_KEYWORD
Parameter.kind屬性的類型是:<enum '_ParameterKind'>
Parameter.default的值是: <class 'inspect._empty'>
Parameter.default的屬性是: <class 'type'>
mappingproxy.items()返回的兩個值分別是:b和b=0
mappingproxy.items()返回的兩個值的類型分別是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind屬性是:POSITIONAL_OR_KEYWORD
Parameter.kind屬性的類型是:<enum '_ParameterKind'>
Parameter.default的值是: 0
Parameter.default的屬性是: <class 'int'>
mappingproxy.items()返回的兩個值分別是:c和*c
mappingproxy.items()返回的兩個值的類型分別是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind屬性是:VAR_POSITIONAL
Parameter.kind屬性的類型是:<enum '_ParameterKind'>
Parameter.default的值是: <class 'inspect._empty'>
Parameter.default的屬性是: <class 'type'>
mappingproxy.items()返回的兩個值分別是:d和d
mappingproxy.items()返回的兩個值的類型分別是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind屬性是:KEYWORD_ONLY
Parameter.kind屬性的類型是:<enum '_ParameterKind'>
Parameter.default的值是: <class 'inspect._empty'>
Parameter.default的屬性是: <class 'type'>
mappingproxy.items()返回的兩個值分別是:e和e=1
mappingproxy.items()返回的兩個值的類型分別是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind屬性是:KEYWORD_ONLY
Parameter.kind屬性的類型是:<enum '_ParameterKind'>
Parameter.default的值是: 1
Parameter.default的屬性是: <class 'int'>
mappingproxy.items()返回的兩個值分別是:f和**f
mappingproxy.items()返回的兩個值的類型分別是:<class 'str'>和<class 'inspect.Parameter'>
Parameter.kind屬性是:VAR_KEYWORD
Parameter.kind屬性的類型是:<enum '_ParameterKind'>
Parameter.default的值是: <class 'inspect._empty'>
Parameter.default的屬性是: <class 'type'>
inspect.Parameter.KEYWORD_ONLY的值是:KEYWORD_ONLY
inspect.Parameter.KEYWORD_ONLY的類型是:<enum '_ParameterKind'>
總結
inspect.signature(fn)
將返回一個inspect.Signature
類型的對象,值爲fn這個函數的所有參數inspect.Signature
對象的paramerters
屬性是一個mappingproxy
(映射)類型的對象,值爲一個有序字典(Orderdict)。這個字典裏的key是即爲參數名,
str
類型這個字典裏的value是一個
inspect.Parameter
類型的對象,根據我的理解,這個對象裏包含的一個參數的各種信息
inspect.Parameter
對象的kind
屬性是一個_ParameterKind
枚舉類型的對象,值爲這個參數的類型(可變參數,關鍵詞參數,etc)inspect.Parameter
對象的default
屬性:如果這個參數有默認值,即返回這個默認值,如果沒有,返回一個inspect._empty
類。