2015-01-20 87 views
2

我的Python項目能夠在兩個不同的目標上執行操作,我們稱它們爲SF和LA。哪個更好的方法來完成這個?作爲常量或字符串比較枚舉

選項A:

destinations.py

LA = 1 
SF = 2 

example_operation.py

import destinations 
run_operation(destination=destinations.LA) 

def run_operation(destination): 
    assert destination in [destinations.LA, destinations.SF] 
    ... 

OR

選項B:

example_operation.py

run_operation(destination='LA') 

def run_operation(destination): 
    assert destination in ['LA', 'SF'] 
    ... 

我知道我也可以使用字典或許多其他方法來實現這一點。我想知道哪些是宣佈和驗證這些的最佳做法。

+0

對於成員測試,一個集合更有效 - 'DESTINATIONS = set(('LA','SF'))'然後'在DESTINATIONS中聲明目的地。但是你還需要這些值嗎? – jonrsharpe 2015-01-20 21:03:46

+0

這是非常主觀的,並不會真的產生任何好的答案。你可以將兩者結合起來,做'LA ='LA'和'SF''SF'。 – poke 2015-01-20 21:14:00

+0

@jonrsharpe我不太關心表現,但謝謝。 「目標」用於稍後確定加載地址。 – disambiguator 2015-01-20 21:30:07

回答

0

由於這是非常主觀的,我會避免評論哪種方式會更好。你可以嘗試從性能點(整數比字符串快,但變量查找比常量慢),或從代碼完成視圖(編輯器可以自動完成變量)或可擴展性(可以輕鬆使用新的東西有新的字符串),但最終它並不重要:這主要是個人偏好。

然而,我想嘗試評論一下驗證問題:如何驗證這些參數?我通常的答案是:不要。

Python通常使用沒有很多故障保險箱。例如,Python沒有真正的私有成員,stdlib的很大一部分甚至沒有完全隱藏它們的內部。如果你願意的話,你可以使用這些內部組件,把所有的東西搞砸 - 但是如果有什麼東西壞了,那就是你的問題。通常情況下,你只需要用戶正確使用你的代碼:如果他們傳遞了一個參數,你的函數並不期望,那麼,某些東西就會失敗。當然,進行某種驗證並不壞,但通常不需要在任何地方進行斷言。

+0

欣賞你的答案。我會盡力找到一個驗證的好地方,只做一次。 – disambiguator 2015-01-20 21:33:14

+0

只是爲了增加答案,在整個標準庫中似乎沒有一種首選的方法來做到這一點(例如,'open()'的'w'參數與'subprocess.PIPE'等)。 – 2015-01-20 21:43:35

+0

此外,一個非常好的答案(解釋py3.4中的新功能),可以在這裏找到(http://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in- python?rq = 1) – 2015-01-20 21:44:40