Python獲取函數的參數的用途及實現方法(參數內省/Bob框架/inspect.signature)


# 一: 函數內省是什麼
"""
    函數內省的例子: --->HTTP 微框架Bob,
                        簡單說明:
                            路由知道你這個接口需要什麼參數

"""
import bobo
@bobo.query('/')
def hello(person):
    return "hello %s" % person
"""
操作步驟:
    1-啓動該文件:
        bobo -f 文件名.py
    2-訪問
        http://localhost:8080  
        出現錯誤:  missing form variable person
    3-添加參數
        http://localhost:8080?person=xiaoxiao
        hello  小小
"""


# 二: 實現Bob框架檢測參數的功能
"""
    inspect模塊下,signature方法創建出一個Signature對象,-->下面的sig_func

            Signature對象有一個bind 方法(參數是一個方法名), ---->功能: 把任意個參數綁定到func中的形參上---->  用途: --->框架用來調用函數前驗證參數

"""
import inspect
def func(name, age, **gender):
    pass

sig_func = inspect.signature(func)
my_para = {"name": "小王", "age": "20", "gender": "man", "type": "A"}

bound_para = sig_func.bind(**my_para)
print(bound_para)

# 刪除一個元素(模擬少傳參數)
del my_para["name"]
bound_para_2 = sig_func.bind(**my_para)
print(bound_para_2)         # TypeError: missing a required argument: 'name'


# 三: 手動獲取參數的方法:
class AcsClient:

    def __init__(
            self,
            ak=None,
            secret=None,
            region_id="cn-hangzhou",
            auto_retry=True,
            max_retry_time=None,
            user_agent=None,
            port=80,
            timeout=None,
            public_key_id=None,
            private_key=None,
            session_period=3600,
            credential=None,
            debug=False):
        a = 1
        b = 2
        c = 3
        print(a+b+c)

# 方法1:
print(AcsClient.__init__.__code__.co_argcount)  # 查看參數的個數, 值爲14
print(AcsClient.__init__.__code__.co_varnames)  # 查看所有的參數名以及 方法中定義的變量, 此處返回一個17元素的元組,前14個爲參數, 後3個是方法中定義的變量
print(AcsClient.__init__.__defaults__)          # 查看參數的默認值

# 方法2:
print(help(AcsClient.__init__))

# 函數中參數的5種分類

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