簡體   English   中英

如何使多個 if 語句更加“pythonic”和簡潔?

[英]How to make a multiple if statements more "pythonic" and condensed?

我正在編寫一個軟件,在將輸入傳遞給數據庫之前檢查 function 的輸入。 為此,我需要在發送數據之前檢查數據類型。 現在我正在使用 5 種不同的 if/else 語句。 我怎樣才能濃縮它並使它更容易閱讀? 謝謝你!

def addUser(USERNAME, PASSWORD, PHONE, CARRIER, SERVER):
    good = True
    if type(USERNAME) == str and good:
        good = True
    else:
        good = False
    if type(PASSWORD) == str and good:
        good = True
    else:
        good = False
    if type(PHONE) == int and good:
        good = True
    else:
        good = False
    if type(CARRIER) == str and good:
        good = True
    else:
        good = False
    if type(SERVER) == str and good: 
        good = True
    else:
        good = False      

將所有條件合二為一:

good = type(USERNAME) == str and type(PASSWORD) == str and type(PHONE) == int AND type(CARRIER) == str and type(SERVER) == str

順便說一句,您通常不應該將int用於電話號碼。 即使我們稱它們為電話號碼,我們也不會對它們執行任何數字操作。 並且將電話號碼放入int變量中會丟失前導零。

你可以遍歷所有這些。 例如:

def check_parameters(params: list):
    for parameter in params:
        if not isinstance(parameter,str):
            return False
    return True


def addUser(USERNAME, PASSWORD, PHONE, CARRIER, SERVER):
    good = check_parameters([USERNAME, PASSWORD, PHONE, CARRIER, SERVER])

注意 isinstance(Your_string, str) 優於 `type() == '

所有條件都必須為真。 最pythonic的方法是兩個創建兩個列表——一個帶有字段,一個帶有各自的類型,然后比較兩個列表並檢查所有條件是否為真。 這樣,您可以通過附加fieldstypes列表來添加任意數量的字段。 這樣,您還可以避免一個很長的語句,其中包含多個條件以及它們之間的and運算符

fields = [USERNAME, PASSWORD, PHONE, CARRIER, SERVER] # append new field if you want
types = [str, str, int, str, str] # append type of new field if you want
good = all(type(field)==types[i] for i, field in enumerate(fields))

為了建立 JeffUK 的答案,您還應該提出一個錯誤,告訴用戶如果一個未通過類型測試,哪個是錯誤的( “錯誤永遠不應該默默地通過。” ):

def check_parameters(params: list):
    for i, parameter in enumerate(params):
        if not isinstance(parameter,str):
            raise ValueError(f'{parameter} in position {i} is {type(parameter)}, not string.')
    return True

然后,您可以將 function 調用包裝在 try 塊中以捕獲錯誤。

def addUser(USERNAME, PASSWORD, PHONE, CARRIER, SERVER):
    try:        
        good = check_parameters([USERNAME, PASSWORD, PHONE, CARRIER, SERVER])
    except ValueError as e:
        print(e)

如果您使用的是 Python 3.10,則match-case語句可能適用於您的特定代碼。

您還可以嘗試將有效的輸入類型放入字典中,這樣可以通過消除 else 語句來壓縮代碼。 例如,

data_type_check = {'username': str, 'password': str, 'phone': int,
                   'carrier': str, 'server': str}

for var, key in zip([USERNAME, PASSWORD, PHONE, CARRIER, SERVER], 
                    ['username', 'password', 'phone', 'carrier', 'server']):

    good = type(var) == data_type_check[key]

    if not good:
        break
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM