[英]python: how to convert if statements to enum or make it 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的方法是兩個創建兩個列表——一個帶有字段,一個帶有各自的類型,然后比較兩個列表並檢查所有條件是否為真。 這樣,您可以通過附加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))
為了建立 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.