成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

【Python】使用裝飾器為Python實(shí)現(xiàn)運(yùn)行時(shí)類(lèi)型檢查

jonh_felix / 1052人閱讀

摘要:背景閑來(lái)無(wú)事想熟悉一下的裝飾器寫(xiě)法,就寫(xiě)了一個(gè)簡(jiǎn)單的類(lèi)型檢查裝飾器。思路利用帶參數(shù)的裝飾器直接傳入變量的預(yù)期類(lèi)型,然后使用檢查類(lèi)型。

背景
閑來(lái)無(wú)事想熟悉一下Python的裝飾器寫(xiě)法,就寫(xiě)了一個(gè)簡(jiǎn)單的類(lèi)型檢查裝飾器。
思路
利用帶參數(shù)的裝飾器直接傳入變量的預(yù)期類(lèi)型,然后使用isinstance檢查類(lèi)型。
代碼
def typeLimits(*types, **typesdict):
    def desc(func):
        def f(*args, **kwargs):
            for i, v in enumerate(types):
                if not isinstance(args[i], v):
                    raise Exception("Need a {} where {} is not.".format(v.__name__, args[i]))
            for parm in typesdict:
                if kwargs.get(parm, None) is None:
                    raise Exception("Need parameter {}.".format(parm))
                if not isinstance(kwargs[parm],typesdict[parm]):
                    raise Exception("Need a {} for {} where {} is not.".format(typesdict[parm].__name__, parm, kwargs[parm]))
            return func(*args, **kwargs)
        return f
    return desc

@typeLimits(int, str)
def printOneIntAndOneString(n, s):
    print(n ** 2, s.upper())

@typeLimits(int, name = str)
def printOneIntAndName(n, name):
    print(n + n, name.upper())

printOneIntAndOneString(1,"abc") # 正確執(zhí)行

# printOneIntAndOneString(1 + 2,3 + 4) 報(bào)錯(cuò)

printOneIntAndName(1, name = "aaa") 正確執(zhí)行

# printOneIntAndName(1) 報(bào)錯(cuò)

# printOneIntAndName(1, name = 2.0) 報(bào)錯(cuò)
感想
這只是一個(gè)游戲之作,檢查類(lèi)型會(huì)耗費(fèi)一些性能,真正部署運(yùn)行的項(xiàng)目是不需要類(lèi)型檢查的,但可以在測(cè)試的時(shí)候使用類(lèi)型檢查來(lái)避免一些無(wú)謂的錯(cuò)誤。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38177.html

相關(guān)文章

  • python_bomb----小白學(xué)裝飾

    什么是裝飾器? 裝飾器就是用來(lái)裝飾函數(shù)。 想要增強(qiáng)原有函數(shù)的功能 但不希望修改原有函數(shù)的定義 在代碼運(yùn)行期間動(dòng)態(tài)增加功能的方式 函數(shù)嵌套函數(shù) 調(diào)用方式:原函數(shù) = 外層函數(shù)(原函數(shù)名)原函數(shù) def desc(fun): def add_info(): print(happy today) fun() print(westos_linux...

    mikasa 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路26-函數(shù)裝飾器和閉包

    摘要:初步認(rèn)識(shí)裝飾器函數(shù)裝飾器用于在源代碼中標(biāo)記函數(shù),以某種方式增強(qiáng)函數(shù)的行為。函數(shù)裝飾器在導(dǎo)入模塊時(shí)立即執(zhí)行,而被裝飾的函數(shù)只在明確調(diào)用時(shí)運(yùn)行。只有涉及嵌套函數(shù)時(shí)才有閉包問(wèn)題。如果想保留函數(shù)原本的屬性,可以使用標(biāo)準(zhǔn)庫(kù)中的裝飾器。 《流暢的Python》筆記本篇將從最簡(jiǎn)單的裝飾器開(kāi)始,逐漸深入到閉包的概念,然后實(shí)現(xiàn)參數(shù)化裝飾器,最后介紹標(biāo)準(zhǔn)庫(kù)中常用的裝飾器。 1. 初步認(rèn)識(shí)裝飾器 函數(shù)裝飾...

    sunny5541 評(píng)論0 收藏0
  • python裝飾器入門(mén)小結(jié)

    摘要:使用一年多了,一直知道有個(gè)裝飾器,很好用,試圖理解過(guò),可能由于資料找的不好,自己的悟性太差,一直沒(méi)有搞清楚,今天查了一些資料,算是理解了,現(xiàn)在簡(jiǎn)單記錄下。 使用python一年多了,一直知道python有個(gè)裝飾器,很好用,試圖理解過(guò),可能由于資料找的不好,自己的悟性太差,一直沒(méi)有搞清楚,今天查了一些資料,算是理解了,現(xiàn)在簡(jiǎn)單記錄下。python的裝飾器本身的功能是在不改變已有函數(shù)本身的...

    SunZhaopeng 評(píng)論0 收藏0
  • Python內(nèi)建函數(shù)大全

    摘要:類(lèi)是一個(gè)在范圍內(nèi)的可變整數(shù)序列。因此,構(gòu)造函數(shù)參數(shù)解釋請(qǐng)參考。如果省略了,它將默認(rèn)為零,并且構(gòu)造函數(shù)用作像和這樣的數(shù)字轉(zhuǎn)換。該函數(shù)刪除指定的屬性只要該對(duì)象允許。返回表示當(dāng)前全局符號(hào)表的字典。將整數(shù)轉(zhuǎn)換為以為前綴的小寫(xiě)十六進(jìn)制字符串。 微信公眾號(hào): Python數(shù)據(jù)科學(xué) 來(lái)源:https://juejin.im/post/5ae3ee...翻譯總結(jié)自官方文檔:https://docs.p...

    PascalXie 評(píng)論0 收藏0
  • flask文檔學(xué)習(xí)筆記1-快速入門(mén)

    摘要:示例如下靜態(tài)路由使用動(dòng)態(tài)變量的路由未指定變量類(lèi)型使用動(dòng)態(tài)變量的路由指定變量類(lèi)型指定的路由變量,可以作為被裝飾的函數(shù)參數(shù)傳入進(jìn)來(lái)。 開(kāi)始決定認(rèn)真的在網(wǎng)上寫(xiě)一些東西,主要原因還是在于希望能提升學(xué)習(xí)效果。雖說(shuō)python寫(xiě)了有幾年,但是web后端框架的確沒(méi)怎么接觸過(guò),買(mǎi)了本狗書(shū)寥寥草草的過(guò)了一遍,發(fā)現(xiàn)很多東西還是理解不深,真的是好記性不如爛筆頭,知識(shí)也要從基礎(chǔ)開(kāi)始,退回來(lái)好好看看官方文檔,再...

    lingdududu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<