Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:如何将if语句转换为enum或使其成为pythonic_Python_Python 2.7_Enums - Fatal编程技术网

python:如何将if语句转换为enum或使其成为pythonic

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

我不太知道这个问题怎么说。这就来了。我有一个看起来很糟糕的代码<代码>建议只需5个案例

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]>