關於python中inspect模塊的一些探究

關於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類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章