2015-01-20 44 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