<p>我知道这是一个老问题,但是我遇到了同样的问题(Python2.7),下面是我如何解决的:</p>
<pre><code>from argparse import ArgumentParser
from enum import Enum
class Color(Enum):
red = 'red'
blue = 'blue'
green = 'green'
def __str__(self):
return self.value
parser = ArgumentParser()
parser.add_argument('color', type=Color, choices=list(Color))
opts = parser.parse_args()
print 'your color was:', opts.color
</code></pre>
<p>请注意,需要定义<code>__str__</code>才能获得<code>ArgumentParser</code>的帮助输出,以包含<code>Color</code>的人类可读(值)。</p>
<p>一些调用示例:</p>
<pre><code>=> python enumtest.py blue
your color was: blue
=> python enumtest.py not-a-color
usage: enumtest.py [-h] {blue,green,red}
enumtest.py: error: argument color: invalid Color value: 'not-a-color'
=> python enumtest.py -h
usage: enumtest.py [-h] {blue,green,red}
positional arguments:
{blue,green,red}
</code></pre>
<hr/>
<p>因为OP的问题是将整数指定为值,所以这里有一个稍微修改过的版本,在这种情况下可以工作(使用枚举名称而不是值作为命令行参数):</p>
<pre><code>class Color(Enum):
red = 1
blue = 2
green = 3
def __str__(self):
return self.name
parser = ArgumentParser()
parser.add_argument('color', type=lambda color: Color[color], choices=list(Color))
</code></pre>
<p>唯一的缺点是错误的参数会导致丑陋的<code>KeyError</code>。只需再添加一点代码,将lambda转换为适当的函数,就可以轻松解决这个问题。</p>
<pre><code>class Color(Enum):
red = 1
blue = 2
green = 3
def __str__(self):
return self.name
@staticmethod
def from_string(s):
try:
return Color[s]
except KeyError:
raise ValueError()
parser = ArgumentParser()
parser.add_argument('color', type=Color.from_string, choices=list(Color))
</code></pre>