2017-09-14 28 views
1

我意識到這可能是一個有點奇怪的請求,但我想有一個方法在Python 3中接​​受任意數量的元組,每個元組都有默認參數。傳遞多個元組與默認參數

我想這樣做的原因是因爲我正在爲我們的團隊編寫腳本功能,並希望用戶的可調用方法易於理解。例如,如果用戶想要調用一個2D繪圖的方法,我想方法參數看起來像這樣:

plot2D(('sweepvar1', start1, stop1, npts1=None, step1=None), 
     ('sweepvar2', start2, stop2, npts2=None, step2=None)) 

所以用戶調用像這樣

plot2D(('var1', 0.0, 1.0, npts1=101), ('var2', 0.5, 0.6, step2=0.001)) 

本質上的困難來了因爲如果用戶想要指定多個點或步長來進行測量,我不知道先驗,但我們需要包含這兩個選項。理想情況下,我想避免強制用戶指定兩者,或者創建一個新變量,該變量是用於在nptsstep之間進行選擇的標誌。

我對default parameters,*args**kwargs有點熟悉,但我似乎無法想出一個乾淨的解決方案來解決上述問題。

在此先感謝您的幫助!

+1

那麼這些都不是元組,因爲這些包含命名參數... –

+0

看起來更像namedtuples。 –

+0

也許你應該使用自定義對象而不是元組,這樣一切都可以由用戶正確初始化。 –

回答

2

這似乎難以實現,不被你可以創建它包裝的參數,併爲每個元組位置&關鍵字args來一個元組的輔助函數。呼叫mkarg(使得參數)

def mka(*args,**kwargs): 
    return (args,kwargs) 

def plot2D(t1,t2): 
    print(t1,t2) 

plot2D(mka('var1', 0.0, 1.0, npts1=101), mka('var2', 0.5, 0.6, step2=0.001)) 

本次測試的回報:

(('var1', 0.0, 1.0), {'npts1': 101}) (('var2', 0.5, 0.6), {'step2': 0.001}) 

現在繁瑣的工作是處理這些參數在plot2D,但至少用戶有一個清晰的界面。

備選:

,如果你真的元組,你可以檢查你的元組參數的len,並配有None如果沒有足夠長的時間。如果第二個「可選」值比第一個使用得少,那很好。適用於少量「可選」值。

def plot2D(tuple1,tuple2): 
    tuple1 += (None,)*(5-len(tuple1)) 
    tuple2 += (None,)*(5-len(tuple2)) 

plot2D(('var1', 0.0, 1.0, 101), ('var2', 0.5, 0.6, None, 0.001)) 
+0

噢,我真的很喜歡這個選擇!有點瘋狂,我甚至沒有考慮過。我認爲迫使用戶指定'None'並不會在現實中造成太多的開銷,所以聽起來像它會對我很好。 – spaderdabomb

+0

有趣的部分:這是我的第一個答案,但我刪除了它(因爲我認爲通過關鍵字對你來說更重要) –