python:如何将if语句转换为enum或使其成为pythonic
我不太知道这个问题怎么说。这就来了。我有一个看起来很糟糕的代码<代码>建议只需5个案例python:如何将if语句转换为enum或使其成为pythonic,python,python-2.7,enums,Python,Python 2.7,Enums,我不太知道这个问题怎么说。这就来了。我有一个看起来很糟糕的代码建议只需5个案例 if avg_recommendation=='BUY': recommendation=5 if avg_recommendation=='OVERWEIGHT': recommendation=4 if avg_recommendation=='HOLD': recommendation=3 if avg_recommendation=='UNDERWEIGHT': recomme
if avg_recommendation=='BUY':
recommendation=5
if avg_recommendation=='OVERWEIGHT':
recommendation=4
if avg_recommendation=='HOLD':
recommendation=3
if avg_recommendation=='UNDERWEIGHT':
recommendation=2
if avg_recommendation=='SELL':
recommendation=1
我想让它变成蟒蛇。我该怎么做?我读过有关enum的文章,看起来它可能是我的解决方案。但我愿意接受任何优雅的解决方案。我还在用python2.7
谢谢。使用一个关键的、价值观的目录。其中key是传入状态,value是传出状态这是一个高度Pythonic的模式,您可能会反复使用它。在许多情况下,您需要在输入状态上分派,在输入状态下,您应该将函数作为值放入dict中
recs = {
'SELL': 1,
'UNDERWEIGHT': 2,
'HOLD': 3,
'OVERWEIGHT': 4,
'BUY': 5,
}
# this will fail correctly with a KeyError for non-expected states.
recommendation = recs[avg_recommendation]
使用dict是使这个Pythonic成为Pythonic的合理方法,但使用enum也是如此 虽然该模块直到Python 3.4才内置到stdlib中,但您可以安装该模块的一个后端口,该模块可以在Python 2.4的每个版本上运行,如果您更喜欢,也可以安装任何版本 使用
enum34
:
>>> import enum
>>> class Recommendation(enum.IntEnum):
... BUY = 5
... OVERWEIGHT = 4
... HOLD = 3
... UNDERWEIGHT = 2
... SELL = 1
>>> Recommendation.BUY
<Recommendation.BUY: 5>
>>> Recommendation.BUY.value
5
>>> Recommendation(5)
<Recommendation.BUY: 5>
>>> recs = [Recommendation.BUY, Recommendation.HOLD, Recommendation.BUY]
>>> avg_rec = sum(recs)//len(rec)
>>> Recommendation(rec)
<Recommendation.OVERWEIGHT: 4>
但是您可以在PyPI上使用许多其他enum模块中的一个。特别是,**的工作原理与上述所有示例中的stdlib完全相同,但也有一些额外的特性。因此,如果您pip安装flufl.enum
,然后将import enum
更改为from flufl import enum
,上述所有操作都将有效,这也将有效:
>>> Recommendation('HOLD')
<EnumValue: Recommendation.HOLD [value=3]>
>建议('HOLD')
*如果您只需要字符串值,而不需要数字,那么这很简单,但显然在您的情况下不起作用
**
flufl.enum
是stdlib模块的主要影响因素之一。您能为答案添加更多颜色吗?如何使用dict分配推荐
?我对python有点陌生。对于非预期状态,这将正确地失败,并出现一个KeyError?因此,程序将崩溃,您认为不值得一提解决方法吗?Padraic,这是一个很好的响应,他们可以简单地使用.get()
来解决KeyError问题。如果有未编码的响应,程序可能会失败。好点。@beroe,是的,如果他们知道it@PadraicCunningham,你猜对了。从我问这个问题的方式,你可能知道我是个新手,但我不知道.get()
。尽管@AliAfshar的回答很好。最后我用了你的答案。很遗憾你删除了它,我认为你的答案连同@AliAfshar和@Abarnert会帮助其他对所有不同解决方案选项感兴趣的人。我看到这个问题被标记为python-2.7,但仅供参考,你也可以在python 2.7中使用3.4枚举。或者。我想pip安装enum34
。但是python2.7识别import enum
,因为import enum34
没有返回名为enum34的模块。另外,在我能够导入enum之后,我收到了打印建议(avg_建议)
的错误,错误是“ValueError:HOLD不是有效的建议”。如何使用课堂推荐?我是python新手。@VT24253:啊,谢谢;我忘了,如果您使用的是3.3或更早版本,则enum34
将安装为enum
(这使它更有用)。我将编辑答案以显示这一点。对于您的第二部分,avg_建议
中到底有什么内容?如果它是一个字符串,您可能需要一个值为Enum
的字符串,而不是一个值为int的Enum
或IntEnum
。(我可能对你的代码做了一些不必要的假设,被avg
变量名…@vt2424253误导了:实际上,重读你的问题,划掉我评论的后半部分,然后阅读编辑后的答案。使用stdlib/enum34
版本,您无法清晰地完成所需的操作,但如果这是您真正需要的,则有一些替代方法可以使其变得简单。@vt2424253:建议['HOLD']
效果很好(请注意方括号,它按名称查找,而不是圆括号,它按值查找)。
>>> Recommendation('HOLD')
<EnumValue: Recommendation.HOLD [value=3]>