[英]Unpacking **kwargs
我正在做一個涉及大量使用 Pandas 進行數據庫過濾的項目。 於是我寫了下面的function:
def filterList(df, dropL, col, criteria, reason="", strCont=False, isIN=False,
notEq=False, isEq=False, isNAN=False, isDup=False, useDropL=True,
dropCol=False, dropColDropList=False, useDropReason=True):
# make a mask
if strCont:
mask = df[col].str.contains(criteria)
elif notEq:
mask = df[col] != criteria
elif isEq:
mask = df[col] == criteria
elif isNAN:
mask = np.isnan(df[col])
elif isIN:
mask = df[col].isin(criteria)
elif isDup:
mask = df.duplicated(col, keep=False)
else:
print("you must specify how to make the mask")
sys.exit()
# fill the droplist
if useDropL:
dropL = dropL.append(df[mask]).fillna("")
dropL.reset_index(drop=True, inplace=True)
if useDropReason:
dropL.loc[dropL["Reason Dropped"] == '', 'Reason Dropped'] = reason
if dropColDropList:
dropL.drop(col, axis='columns', inplace=True)
# filter the list
df_Filtered = df.drop(df[mask].index)
df_Filtered.reset_index(drop=True, inplace=True)
# special instructions
if dropCol:
df_Filtered.drop(col, axis='columns', inplace=True)
return df_Filtered, dropL
它的設置使得我必須將 boolean 變量之一作為 true 傳遞,以便指定如何將匹配標准與特定列進行比較。 它還跟蹤丟棄的項目並填寫該項目被丟棄的原因(用於稍后的錯誤手動錯誤檢查)。
我不想有這么長的聲明聲明。 我的意思是,它有效,我只是覺得它看起來很丑。
所以我想我可以使用**kwargs
來捕獲所有布爾值,然后只在其中查找變量名,但是我到處尋找如何做到這一點的地方都在說這是世界上最糟糕的想法。
給定的原因似乎圍繞着不知道將傳遞哪些變量以及可能的變量名沖突。 但我是唯一將編寫或運行此代碼的人,所以在這種情況下我不擔心變量名沖突。
所以
和
由於過濾條件是互斥的,因此您應該只使用一個指定過濾方法的參數,而不是使用大量的 boolean 參數。
def filterList(df, dropL, col, filterType, reason="", useDropL=True,
dropCol=False, dropColDropList=False, useDropReason=True):
if filterType == "strCont":
mask = df[col].str.contains(criteria)
elif filterType == "notEq":
mask = df[col] != criteria
...
else:
print("you must specify how to make the mask")
sys.exit()
...
沒有解決您的特定用例,但有時需要有一個 function 可以占用大量 arguments,而且這些必須是特定的。 使用kwargs
並不是世界上最糟糕的想法,但它會產生兩個你必須解決的問題:
kwargs
object 中不存在這些,您必須自己設置默認 arguments,並且您還必須處理哪些項目是可選的,哪些是必需的。話雖如此,可讀性也是一個因素,您對大型聲明的“丑陋”感到擔憂是正確的。 為了解決這個問題,我認為只是改變 decletation 的格式會更聰明。 寫這樣的東西是完全可以接受的,而且更具可讀性:
def filterList(df,
dropL,
col,
criteria,
reason="",
strCont=False,
isIN=False,
notEq=False,
isEq=False,
isNAN=False,
isDup=False,
useDropL=True,
dropCol=False,
dropColDropList=False,
useDropReason=True):
如果需要,這種格式甚至可以更容易地為每個變量添加注釋或類型提示
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.