国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

優(yōu)化 ParamValidator,讓編輯器Pycharm智能提示校驗(yàn)方法

這篇具有很好參考價(jià)值的文章主要介紹了優(yōu)化 ParamValidator,讓編輯器Pycharm智能提示校驗(yàn)方法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、前置說(shuō)明

1、本節(jié)目標(biāo)

  • 了解 __getattribute__ 的特性
  • 使用 __getattribute__ 結(jié)合 Validator 類(lèi)中的方法,讓編輯器 Pycharm 智能提示 ParamValidator 類(lèi)中的方法

2、相關(guān)回顧

  • 基于 Validator 類(lèi)實(shí)現(xiàn) ParamValidator,用于校驗(yàn)函數(shù)參數(shù)

二、操作步驟

1、項(xiàng)目目錄

優(yōu)化 ParamValidator,讓編輯器Pycharm智能提示校驗(yàn)方法,Python 裝飾器從入門(mén)到進(jìn)階,python

  • atme : @me 用于存放臨時(shí)的代碼片斷或其它內(nèi)容。
  • pyparamvalidate : 新建一個(gè)與項(xiàng)目名稱(chēng)同名的package,為了方便發(fā)布至 pypi 。
  • core : 用于存放核心代碼。
  • tests : 用于存放測(cè)試代碼。
  • utils : 用于存放一些工具類(lèi)或方法。

2、代碼實(shí)現(xiàn)

atme/demo/validator_v6/param_validator.py

import inspect
from functools import wraps
from typing import TypeVar, Callable

from atme.demo_validator.validator_v6.validator import Validator

Self = TypeVar('Self', bound='ParameterValidator')


class ParameterValidator:

    def __init__(self, param_name: str, param_rule_des=None):
        """
        :param param_name: 參數(shù)名
        :param param_rule_des: 該參數(shù)的規(guī)則描述
        """
        self.param_name = param_name
        self.param_rule_des = param_rule_des

        self._validators = []

        def __getattribute__(self, name: str):
            """
            __getattribute__ 在每次訪問(wèn)對(duì)象的屬性時(shí)都會(huì)觸發(fā),不管屬性是否存在。

            以用戶(hù)使用 ParamValidator("param").is_string(exception_msg='param must be string').is_not_empty() 為例,代碼執(zhí)行過(guò)程如下:

            1. 當(dāng)用戶(hù)調(diào)用 ParamValidator("param").is_string(exception_msg='param must be string') 時(shí),
            2. 由于 is_string 方法不存在,__getattr__ 方法被調(diào)用,返回 validator_method 函數(shù)(此時(shí)未被調(diào)用),is_string 方法實(shí)際上是 validator_method 函數(shù)的引用,
            3. 當(dāng)執(zhí)行 is_string(exception_msg='param must be string') 時(shí),is_string 方法被調(diào)用, 使用關(guān)鍵字參數(shù)傳遞 exception_msg='param must be string',
            4. 實(shí)際上是執(zhí)行了 validator_method(exception_msg='param must be string') , validator_method 函數(shù)完成調(diào)用后,執(zhí)行函數(shù)體中的邏輯:
                 - 向 self._validators 中添加了一個(gè)元組 ('is_string', (),  {'exception_msg': 'param  must  be  string'})
                 - 返回 self 對(duì)象
            5. self 對(duì)象繼續(xù)調(diào)用 is_not_empty(), 形成鏈?zhǔn)秸{(diào)用效果,此時(shí)的 validator_method 函數(shù)的引用就是 is_not_empty, 調(diào)用過(guò)程與 1-4 相同。
            """

            # 如果獲取到已存在的屬性, 則使用 object.__getattribute__(self, name) 直接獲取對(duì)象的屬性值
            if name in ['param_name', 'param_rule_des', '_validators']:
                return object.__getattribute__(self, name)

            # 如果獲取到不存在的屬性,則創(chuàng)建了函數(shù) validator_method
            def validator_method(*args, **kwargs):
                self._validators.append((name, args, kwargs))
                return self

            return validator_method

    def __call__(self, func: Callable) -> Callable:
        @wraps(func)
        def wrapper(*args, **kwargs):
            # 獲取函數(shù)的參數(shù)和參數(shù)值
            bound_args = inspect.signature(func).bind(*args, **kwargs).arguments

            if self.param_name in kwargs:
                # 如果函數(shù)被裝飾,且以關(guān)鍵字參數(shù)傳值,則從 kwargs 中取參數(shù)值
                value = kwargs[self.param_name]
            else:
                # 如果函數(shù)被裝飾,且以位置參數(shù)傳值,則從 bound_args 中取參數(shù)值
                value = bound_args.get(self.param_name)

            # 實(shí)例化 Validator 對(duì)象
            validator = Validator(value, field=self.param_name, rule_des=self.param_rule_des)

            # 遍歷所有校驗(yàn)器(注意:這里使用 vargs, vkwargs,避免覆蓋原函數(shù)的 args, kwargs)
            for method_name, vargs, vkwargs in self._validators:
                # 通過(guò) 函數(shù)名 反射獲取校驗(yàn)函數(shù)對(duì)象
                validate_method = getattr(validator, method_name)

                # 執(zhí)行校驗(yàn)函數(shù)
                validate_method(*vargs, **vkwargs)

            # 執(zhí)行原函數(shù)
            return func(*args, **kwargs)

        return wrapper

    '''
    ==============================分隔符===============================
    
    以下所有方法,是從 Validator 類(lèi)中復(fù)制過(guò)來(lái),目的是:
    - 為了讓編輯器如 Pycharm 智能提示 ParameterValidator 本類(lèi)中可以使用的校驗(yàn)方法;
    - 這些方法僅供 Pycharm 智能提示使用,沒(méi)有任何實(shí)際作用;
        可以是:
            def is_string(self, exception_msg=None) -> Self:
                ...
        也可以是:
            def is_string(self, exception_msg=None) -> Self:
                return isinstance(self.value, str)            
    - ParameterValidator 類(lèi)的實(shí)例通過(guò) __getattribute__ 方法動(dòng)態(tài)收集用戶(hù)的調(diào)用方法;
    - 然后使用 __call__ 方法反射調(diào)用 Validator 類(lèi)中的校驗(yàn)方法
    
    在模塊中定義了: Self = TypeVar('Self', bound='ParameterValidator'),目的是:
    - 方便從 Validator 類(lèi)中復(fù)制校驗(yàn)方法,粘貼之后不做任何代碼層面的修改:
    - 方便鏈?zhǔn)秸{(diào)用,如: @ParameterValidator("param").is_string().is_not_empty()
    '''

    def is_string(self, exception_msg=None) -> Self:
        return isinstance(self.value, str)

    def is_not_empty(self, exception_msg=None) -> Self:
        return bool(self.value)

3、測(cè)試代碼

atme/demo/validator_v6/test_param_validator.py


import pytest

from atme.demo.validator_v6.param_validator import ParameterValidator


def test_is_string_validator_passing_01():
    """
    校驗(yàn)一個(gè)參數(shù)
    """

    @ParameterValidator("param").is_string(exception_msg='param must be string')
    def example_function(param):
        print(param)
        return param

    assert example_function(param="test") == "test"

    with pytest.raises(ValueError) as exc_info:
        example_function(param=123)

    print(exc_info.value)
    assert "invalid" in str(exc_info.value)


def test_is_string_validator_passing_02():
    """
    校驗(yàn)多個(gè)參數(shù)
    """

    @ParameterValidator("param2").is_string().is_not_empty()
    @ParameterValidator("param1").is_string().is_not_empty()
    def example_function(param1, param2):
        print(param1, param2)
        return param1, param2

    assert example_function("test1", "test2") == ("test1", "test2")

    with pytest.raises(ValueError) as exc_info:
        example_function(123, 123)

    print(exc_info.value)
    assert "invalid" in str(exc_info.value)

4、日志輸出

執(zhí)行 test 的日志如下,驗(yàn)證通過(guò):

============================= test session starts =============================
collecting ... collected 2 items

test_param_validator.py::test_is_string_validator_passing_01 PASSED      [ 50%]test
param error: "123" is invalid. due to: param must be string

test_param_validator.py::test_is_string_validator_passing_02 PASSED      [100%]test1 test2
param2 error: "123" is invalid.


============================== 2 passed in 0.01s ==============================

三、后置說(shuō)明

1、要點(diǎn)小結(jié)

  • __getattribute__ 在每次訪問(wèn)對(duì)象的屬性時(shí)都會(huì)觸發(fā),不管屬性是否存在。
  • 通過(guò)重寫(xiě) __getattribute__,可以自定義屬性的獲取邏輯,實(shí)現(xiàn)了對(duì)特定屬性的直接訪問(wèn)(param_name 、param_rule_des 、 _validators),而對(duì)于其他屬性,則創(chuàng)建名為 validator_method 的函數(shù),將其作為屬性返回。
  • Validator 類(lèi)中復(fù)制過(guò)來(lái)的校驗(yàn)方法,是為了讓編輯器如 Pycharm 智能提示 ParameterValidator 本類(lèi)中可以使用的校驗(yàn)方法,沒(méi)有任何實(shí)際作用。
  • 在模塊中定義 Self = TypeVar('Self', bound='ParameterValidator'),是為了方便鏈?zhǔn)秸{(diào)用,如 @ParameterValidator("param").is_string().is_not_empty() 。
  • 經(jīng)過(guò)優(yōu)化后,Pycharm 可以正常智能提示可調(diào)用的校驗(yàn)方法:
    優(yōu)化 ParamValidator,讓編輯器Pycharm智能提示校驗(yàn)方法,Python 裝飾器從入門(mén)到進(jìn)階,python

2、下節(jié)準(zhǔn)備

  • validator 常用校驗(yàn)器的實(shí)現(xiàn)

點(diǎn)擊進(jìn)入《Python裝飾器從入門(mén)到進(jìn)階》總目錄文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-809136.html

到了這里,關(guān)于優(yōu)化 ParamValidator,讓編輯器Pycharm智能提示校驗(yàn)方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 純凈Python環(huán)境的安裝以及配置PyCharm編輯器

    純凈Python環(huán)境的安裝以及配置PyCharm編輯器

    優(yōu)質(zhì)的教程可以讓我們少走很多彎路,這一點(diǎn)毋庸置疑。去年二月我接觸了Python,并找到了一份優(yōu)質(zhì)的配置教程,讓我能夠快速上手Python的學(xué)習(xí)?,F(xiàn)在,一年多過(guò)去了,我已經(jīng)有了很大的進(jìn)步和變化,這也讓我更加想要把我的學(xué)習(xí)經(jīng)驗(yàn)和知識(shí)分享給更多的人。正是因?yàn)橛辛诉@

    2024年02月16日
    瀏覽(22)
  • windows11下pycharm怎么完全卸載?完整卸載pycharm編輯器的教程

    windows11下pycharm怎么完全卸載?完整卸載pycharm編輯器的教程

    在卸載pycharm時(shí)都有遇到卸載不干凈不完全的問(wèn)題,那么具體怎樣做才能完全卸載pycharm呢? 一、卸載pycharm 步驟1:卸載軟件并刪除安裝目錄 我們先進(jìn)入到安裝的目錄中,找到bin目錄,點(diǎn)進(jìn)去之后找到Uninstall.exe,執(zhí)行它進(jìn)行卸載,如圖所示: ? ? 步驟2:刪除相關(guān)的注冊(cè)表 要

    2024年02月07日
    瀏覽(34)
  • Pycharm 配置jupyter notebook 且Windos 安裝vim編輯器

    Pycharm 配置jupyter notebook 且Windos 安裝vim編輯器

    請(qǐng)記住要想讓你的python成功安裝jupyter notebook ,你的python最好使用p大于等于python3.7 最好不要在python2大版本中安裝jupyternotebook 這個(gè)會(huì)報(bào)錯(cuò),需要你改一些配置文件,除非你想挑戰(zhàn)一下自己,不過(guò)后面我會(huì)嘗試在python2大版本中安裝,報(bào)錯(cuò)的原因是有的庫(kù)依賴(lài)的python版本比較高,

    2024年02月06日
    瀏覽(24)
  • 【一個(gè)好用的智能編輯器】用于寫(xiě)代碼很智能。Cursor代碼編輯器。Cursor官網(wǎng)地址。

    【一個(gè)好用的智能編輯器】用于寫(xiě)代碼很智能。Cursor代碼編輯器。Cursor官網(wǎng)地址。

    這個(gè)編輯器發(fā)展非???,只可惜你必須懂英文,當(dāng)然,你使用少量翻譯軟件也可以不用懂英文的情況下仍然可以快樂(lè)的使用它。 今天在另一臺(tái)機(jī)器想下載Cursor編輯器,在度娘那里竟然找不到它的地址。其中有一個(gè)微博說(shuō)有分享地址,結(jié)果原來(lái)在標(biāo)題~~算我眼瞎。。。。。不過(guò)

    2024年02月17日
    瀏覽(36)
  • web架構(gòu)師編輯器內(nèi)容-完成屬性設(shè)置的優(yōu)化

    web架構(gòu)師編輯器內(nèi)容-完成屬性設(shè)置的優(yōu)化

    對(duì)于業(yè)務(wù)組件來(lái)說(shuō),其屬性是有很多的,如果把所有屬性都平鋪在頁(yè)面上,就會(huì)非常長(zhǎng),而且想要更改其中的某些屬性,可能需要向下滾動(dòng)很久才能找到,對(duì)于UI的交互不是很友好,需要對(duì)屬性的不同特性進(jìn)行分組。 改造前: 改造后: 先來(lái)看一下通用屬性: CommonComponentPro

    2024年01月22日
    瀏覽(21)
  • 解決ModuleNotFoundError: No module named ‘xlwt‘步驟 安裝xlwt模塊(編輯器:Pycharm)超詳細(xì)!

    解決ModuleNotFoundError: No module named ‘xlwt‘步驟 安裝xlwt模塊(編輯器:Pycharm)超詳細(xì)!

    遇到如下報(bào)錯(cuò): ?環(huán)境中沒(méi)有xlwt模塊。 開(kāi)始解決: ①找到安裝路徑: 找到解釋器(Base interpreter)所在路徑: (我的是)【C:Users12502AppDataLocalProgramsPythonPython36】。 打開(kāi)上述路徑下的【Scripts】文件,即路徑:【C:Users12502AppDataLocalProgramsPythonPython36Scripts】。 復(fù)制這段

    2024年02月11日
    瀏覽(29)
  • Python零基礎(chǔ)教程6——編輯器的選擇(IDLE?Visual Studio Code?PyCharm?Anaconda?)

    Python零基礎(chǔ)教程6——編輯器的選擇(IDLE?Visual Studio Code?PyCharm?Anaconda?)

    上一節(jié)課是1-5節(jié)課復(fù)盤(pán) 大家無(wú)論之前有沒(méi)有看過(guò) 都對(duì)前面的知識(shí)有了一定的了解 我在其中提到我的2023年總結(jié) 沒(méi)人評(píng)論的事 沒(méi)想到真有熱心腸的小伙伴幫忙 再次感謝! 有評(píng)必回呀,互動(dòng)起來(lái)! 這節(jié)課就是復(fù)盤(pán)之后產(chǎn)生的 遂 更加貼合實(shí)際! 在我們熟悉了一定的編程之后 我

    2024年01月25日
    瀏覽(24)
  • 【Pycharm2022.2.1】python編輯器最新版安裝教程(包含2017-2022的所有版本win/mac/linux)

    【Pycharm2022.2.1】python編輯器最新版安裝教程(包含2017-2022的所有版本win/mac/linux)

    前言 嗨嘍~大家好呀,這里是魔王吶 ? ~! 永久安裝 Pycharm(2017-2022的win/mac/linux所有版本)/ IntelliJ IDEA也可以, 按照本文教程所寫(xiě)的,具體步驟跟著下面的圖文教程一步一步來(lái)就行,一分鐘即可搞定,過(guò)程也非常簡(jiǎn)單。 第一步 下載pycharm安裝包 官網(wǎng)下載鏈接如: 官網(wǎng)下載 嫌慢的

    2024年02月14日
    瀏覽(24)
  • 【Unity編輯器擴(kuò)展】字庫(kù)裁剪工具, 優(yōu)化字體文件大小,批量修改文本組件字體

    【Unity編輯器擴(kuò)展】字庫(kù)裁剪工具, 優(yōu)化字體文件大小,批量修改文本組件字體

    原理: 1. 掃描項(xiàng)目中用到的字符集; 2. 把字體文件裁剪掉沒(méi)用到的字符,僅保留項(xiàng)目中用到的字符; 3. 生成裁剪后的字體文件; 工具功能設(shè)計(jì): 1. 支持通過(guò)拖拽字體文件或文件夾批量選擇需要裁剪的字體文件。 2. 掃描工程中使用到的字符集:主要是獲取prefab中Text、TextM

    2024年02月15日
    瀏覽(25)
  • AI文案編輯器:智能寫(xiě)作助手解鎖你的寫(xiě)作靈感

    AI文案編輯器:智能寫(xiě)作助手解鎖你的寫(xiě)作靈感

    隨著科技日新月異,智能AI創(chuàng)新應(yīng)用層出不窮。值得矚目的是,AI文案編輯器的出現(xiàn),為眾多用戶(hù)提供了簡(jiǎn)便而強(qiáng)大的寫(xiě)作支持。該軟件因其強(qiáng)大的功能特性以及無(wú)與倫比的便利性,得到了廣泛認(rèn)可及運(yùn)用。接下來(lái),我將從幾個(gè)方面,闡述為何稱(chēng)得上AI文案編輯軟件為您必備的

    2024年02月20日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包