簡體   English   中英

開箱**kwargs

[英]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來捕獲所有布爾值,然后只在其中查找變量名,但是我到處尋找如何做到這一點的地方都在說這是世界上最糟糕的想法。

給定的原因似乎圍繞着不知道將傳遞哪些變量以及可能的變量名沖突。 但我是唯一將編寫或運行此代碼的人,所以在這種情況下我不擔心變量名沖突。

所以

  1. 我的情況是否可以接受直接將 kwarg 鍵轉換為變量名?

  1. 如果是這樣/不是,我將如何(否則)go 關於這個? (我對kwargs一點都不熟悉,對字典也只是稍微熟悉,我理解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並不是世界上最糟糕的想法,但它會產生兩個你必須解決的問題:

  1. 將使用 function 的程序員/用戶不會有任何關於 function 期望得到什么、可以傳遞什么值等的指示/文檔。
  2. 如果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.

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