亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何限制可以傳遞給方法參數的允許值

如何限制可以傳遞給方法參數的允許值

肥皂起泡泡 2022-01-18 16:14:22
在 Python 3 中,我想限制傳遞給此方法的允許值:my_request(protocol_type, url)使用類型提示我可以寫:my_request(protocol_type: str, url: str)所以協議和 url 僅限于字符串,但我如何驗證protocol_type它只接受有限的一組值,例如'http'和'https'?
查看完整描述

3 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

一種方法是在方法中編寫代碼來驗證傳入的值是“http”還是“https”,如下所示:


if (protocol_type == 'http') or (protocol_type == 'https'):

  Do Something

else:

  Throw an exception

這將在運行時正常工作,但在編寫代碼時不會提供問題指示。


這就是為什么我更喜歡使用 Enum 以及 Pycharm 和 mypy 實現的類型提示機制的原因。


對于下面的代碼示例,您將在 Pycharm 的代碼檢查中收到警告,請參閱隨附的屏幕截圖。屏幕截圖顯示,如果您輸入的值不是枚舉,您將收到“預期類型:...”警告。


代碼:


"""Test of ENUM"""


from enum import Enum



class ProtocolEnum(Enum):

    """

    ENUM to hold the allowed values for protocol

    """

    HTTP: str = 'http'

    HTTPS: str = 'https'



def try_protocol_enum(protocol: ProtocolEnum) -> None:

    """

    Test of ProtocolEnum

    :rtype: None

    :param protocol: a ProtocolEnum value allows for HTTP or HTTPS only

    :return:

    """

    print(type(protocol))

    print(protocol.value)

    print(protocol.name)



try_protocol_enum(ProtocolEnum.HTTP)


try_protocol_enum('https')

輸出:


<enum 'ProtocolEnum'>

http

HTTP

http://img1.sycdn.imooc.com//61e676ff0001191d19160689.jpg

查看完整回答
反對 回復 2022-01-18
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

您可以檢查函數中的輸入是否正確:


def my_request(protocol_type: str, url: str):

    if protocol_type in ('http', 'https'):

        # Do x

    else:

        return 'Invalid Input'  # or raise an error


查看完整回答
反對 回復 2022-01-18
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

我想你可以使用裝飾器,我有類似的情況,但我想驗證參數類型:


def accepts(*types):

    """

    Enforce parameter types for function

    Modified from https://stackoverflow.com/questions/15299878/how-to-use-python-decorators-to-check-function-arguments

    :param types: int, (int,float), if False, None or [] will be skipped

    """

    def check_accepts(f):

        def new_f(*args, **kwds):

            for (a, t) in zip(args, types):

                if t:

                    assert isinstance(a, t), \

                           "arg %r does not match %s" % (a, t)

            return f(*args, **kwds)

        new_f.func_name = f.__name__

        return new_f

    return check_accepts

然后用作:


@accepts(Decimal)

def calculate_price(monthly_item_price):

    ...

你可以修改我的裝飾器來實現你想要的。


查看完整回答
反對 回復 2022-01-18
  • 3 回答
  • 0 關注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號