2012-03-01 56 views
6

我有一個Python函數,它需要一些參數,其中之一是要執行的模擬類型。例如,選項可能是「太陽」,「查看」或「既Pythonic方式有2-3個選項作爲參數的選擇

什麼是Python化的方式,允許用戶設置這些

我可以看到各種選項:?

  1. 使用一個字符串變量,並檢查它 - 所以這將是func(a, b, c, type='solar')

  2. 在類集合一些常量和使用func(a, b, c, type=classname.SOLAR)

  3. 如果只有兩個選項(就像我的一些函數一樣)將其強制爲True/False參數,通過使用類似func(a, b, c, do_solar=False)的內容讓它使用'view'選項。

Pythonic這樣做的任何偏好(或其他想法)?

+2

你不應該使用'type'作爲參數名,因爲這是一個內置的... – 2012-03-01 19:53:45

回答

3

我不喜歡任何這些選項。

我會定義兩個不同的函數,perform_solar(a, b, c)perform_view(a, b, c),讓調用者根據哪個參數決定要使用哪個函數。

如果你認爲你不得不將它們打包成一個單一函數的原因是它們共享狀態,你應該在一個對象中共享該狀態並將函數定義爲方法。

1

您可以使用可選的(關鍵字)參數這樣

def func(a, b, c, **kw): 
    if kw.get('do_solar'): 
     # Do Solar 
    if kw.get('do_view'): 
     # Do view 
3

如果點尼克拉斯在his answer使不成立,我會用一個字符串參數。標準庫中有Python模塊使用類似的參數。例如csv.reader()

sim_func(a, b, c, sim_type='solar') 

記得給的功能,幫助人們,如果他們在錯誤的東西里面鍵入一個合理的誤差。

def sim_func(a, b, c, sim_type='solar'): 
    sim_types = ['solar', 'view', 'both'] 
    if sim_type not in sim_types: 
     raise ValueError("Invalid sim type. Expected one of: %s" % sim_types) 
    ... 
2

由於功能是Python對象,你實際上可以處理* ARGS作爲方法的列表並通過類型的模擬作爲結尾arbitratry ARGS。這將有利於您在將來定義新的模擬而不必重構此代碼。

def func(a, b, c, *args): 
    for arg in args: 
     arg(a, b, c) 

def foosim(a, b, c): 
    print 'foosim %d' % (a + b + c) 

def barsim(a, b, c): 
    print 'barsim %d' % (a * b * c) 

用途:

func(2, 2, 3, foosim) 
func(2, 2, 3, barsim) 
func(2, 2, 3, foosim, barsim) 

輸出:

foosim 7 
barsim 12 
foosim 7 
barsim 12