很長時間以來,我一直在試圖找出將標誌傳遞給python函數的最佳方式。最直接的方法是一樣的東西:Python:將標誌傳遞給函數
def func(data, flag1, flag2, flag3):
...
func(my_data, True, False, True)
這是非常好的,簡潔,但令人難以置信的難以辨認,因爲這個詞「真」或「假」不能告訴你正在設置什麼標誌,和你必須仔細計算從左邊開始的論點。你可以讓它們成爲關鍵字參數:
def func(data, flag1=False, flag2=False, flag3=False):
...
func(my_data, flag1=True, flag3=True)
但是這是多餘的,因爲「真」根本沒有任何意義。我可以把它作爲一個清單:
func(mydata, ['flag1', 'flag3'])
或
func(mydata, [func.flag1, func.flag3])
但第一感覺比較髒,使用字符串作爲標誌,第二個還是有點重複。理想情況下,我想說的是:
func(my_data, flag1, flag3)
將標誌傳遞給具有最小冗餘和冗餘的函數。有什麼辦法在Python中做這樣的事情?
編輯: 我結束了去:
func(mydata, flagA=1, flagB=1)
主要用於上述原因:編譯時檢查(對傳入的字符串),沒有命名空間污染(相對於使用全局「ENUM」 S )和最小的樣板(= 1或= 0僅爲2個字符,對於= True或= False則爲5或6)。這也使得該標誌很容易設置的默認值:
def func(data, flagA=1, flagB=0, flagC=1):
...
這是更爲清晰,遠遠高於鐵圈跳提取並分配默認爲** kwarg風格的標誌更容易。這些標誌基本上是靜態檢查的,並且非常清晰/可以寫入。現在,如果我能刮掉的最後兩個字符...
你爲什麼想/需要傳遞的標誌擺在首位?也許你應該重新考慮你的接口...... –
這些標誌將被用來設置數據結構中的布爾值,然後這些布爾值將控制對數據結構進行操作的函數的未來行爲。這完全不是面向對象的方法,但我選擇它不是簡單的;不管怎樣,即使我做到了OO風格,行爲變化也很微妙,可能不值得創建一個完整的類來處理。 –
也許你可以傳遞一個包含值的(簡單的)數據結構呢?一個'集'的標誌,或'Dict'映射標誌名稱bools ... –