2015-01-08 176 views
8

参数我注意到,许多图书馆现在似乎更喜欢使用过的参数枚举类型变量的字符串。枚举VS字符串作为函数

在那里,人们以前会用枚举,例如dateutil.rrule.FR一个星期五,似乎这已经朝着使用字符串移动(例如“FRI”)。

在numpy的(或大熊猫就此而言)相同,其中searchsorted例如使用一个字符串(例如侧=“左”,或侧=“右”),而不是限定的枚举。为免生疑问,蟒蛇3.4在这之前可能已被很容易地作为一个枚举这样实现的:

class SIDE: 
    RIGHT = 0 
    LEFT = 1 

和枚举类型变量的优点是显而易见的:没有引发错误你不能拼错他们,他们提供的IDE适当的支持,等等

那么,为什么使用字符串所有,而不是坚持枚举类型?这不会让程序更容易出现用户错误吗?这不像枚举会造成开销 - 如果有的话它们应该稍微高效。那么为什么这种模式转变发生?

回答

2

恕我直言,这是一个品味的问题。有些人喜欢这种风格:

def searchsorted(a, v, side='left', sorter=None): 
    ... 
    assert side in ('left', 'right'), "Invalid side '{}'".format(side) 
    ... 

numpy.searchsorted(a, v, side='right') 

是的,如果你调用searchsortedside='foo'你以后可能会在运行时得到一个AssertionError方式 - 但至少该bug会很容易发现寻找回溯。

而其他人可能更喜欢(对优势突出你):

numpy.searchsorted(a, v, side=numpy.CONSTANTS.SIDE.RIGHT) 

我赞成前者,因为我觉得很少使用常数是不值得的命名空间的残余。您可能会不同意,并且由于其他问题,人们可能会与任何一方保持一致。

如果你真的关心,没有什么能阻止你定义自己的“枚举”:

class SIDE(object): 
    RIGHT = 'right' 
    LEFT = 'left' 

numpy.searchsorted(a, v, side=SIDE.RIGHT) 

,我认为这是不值得,但是这又是一个口味问题。

[更新]

斯特凡做了一个公平点:

只要在需要时改变这种枚举的值,查找在许多地方替换字符串不是我有趣的想法:-)

我可以看到痛苦这可能是一种语言没有命名的参数 - 使用你要搜索的字符串'right'并获得大量误报的例子。在Python中,您可以缩小搜索范围side='right'

当然,如果你面对的是已经有一组定义枚举/常数(如外部C库)的接口则是,通过各种手段模仿现有的公约。

3

我想枚举更安全尤其是对于多个开发人员更大的系统。

只要在需要时改变这种枚举的值,查找在许多地方替换字符串不是我的乐趣所在:-)

最重要的标准是恕我直言使用:在一个模块或甚至一个包中使用一个字符串似乎是好的,在公共API我更喜欢枚举。

1

我更喜欢调试的原因字符串。像

side=1, opt_type=0, order_type=6 

对象比较

side='BUY', opt_type='PUT', order_type='FILL_OR_KILL' 

我也很喜欢“枚举”里的值是字符串:

class Side(object): 
    BUY = 'BUY' 
    SELL = 'SELL' 
    SHORT = 'SHORT' 
1

严格地说Python没有枚举 - 或者至少是之前没有v3.4

https://docs.python.org/3/library/enum.html

我更愿意认为你的例子如程序员定义的常量。

在​​,一组常数具有字符串值。虽然代码使用常量名称,但用户更经常使用这些字符串。

e.g. argparse.ZERO_OR_MORE = '*' 
arg.parse.OPTIONAL = '?' 

numpy是上了年纪的第三方软件包之一(至少它的根像numeric是)。字符串值比枚举更常见。事实上,我不能想到任何枚举(如你所定义的那样)。