我正在撰寫一個軟體,在將其傳遞給資料庫之前檢查函式的輸入。為此,我需要在發送資料之前檢查資料型別。現在我正在使用 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
uj5u.com熱心網友回復:
所有條件都必須為 True。最pythonic的方法是兩個創建兩個串列——一個包含欄位,一個包含各自的型別,然后比較兩個串列并檢查所有條件是否為真。通過這種方式,您可以通過附加fields和types串列來添加任意數量的欄位。通過這種方式,您還可以避免一個包含多個條件的非常長的陳述句以及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))
uj5u.com熱心網友回復:
將所有條件合二為一:
good = type(USERNAME) == str and type(PASSWORD) == str and type(PHONE) == int AND type(CARRIER) == str and type(SERVER) == str
順便說一句,您通常不應該使用int電話號碼。即使我們稱它們為電話號碼,我們也不會對它們執行任何數字運算。將電話號碼放入int變數將丟失前導零。
uj5u.com熱心網友回復:
你可以遍歷所有這些。例如:
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() == '
uj5u.com熱心網友回復:
為了建立在 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
然后,您可以將函式呼叫包裝在 try 塊中以捕獲錯誤。
def addUser(USERNAME, PASSWORD, PHONE, CARRIER, SERVER):
try:
good = check_parameters([USERNAME, PASSWORD, PHONE, CARRIER, SERVER])
except ValueError as e:
print(e)
uj5u.com熱心網友回復:
如果您使用的是 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
甚至更簡單
for var, vartype in zip([USERNAME, PASSWORD, PHONE, CARRIER, SERVER],
[str, str, int, str, str]):
good = type(var) == vartype
if not good:
break
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/386306.html
