<p>这是对<a href="https://stackoverflow.com/a/46385352/1976323">ron rothman's answer</a>的改进。通过重写<code>__repr__</code>并稍微更改<code>to_string</code>,我们可以在用户输入错误值时从<code>argparse</code>获得更好的错误消息。</p>
<pre class="lang-py prettyprint-override"><code>import argparse
import enum
class SomeEnum(enum.IntEnum):
ONE = 1
TWO = 2
# magic methods for argparse compatibility
def __str__(self):
return self.name.lower()
def __repr__(self):
return str(self)
@staticmethod
def argparse(s):
try:
return SomeEnum[s.upper()]
except KeyError:
return s
parser = argparse.ArgumentParser()
parser.add_argument('some_val', type=SomeEnum.argparse, choices=list(SomeEnum))
args = parser.parse_args()
print('success:', type(args.some_val), args.some_val)
</code></pre>
<p>在ron rothman的例子中,如果我们将颜色<code>yellow</code>作为命令行参数传递,就会得到以下错误:</p>
<pre><code>demo.py: error: argument color: invalid from_string value: 'yellow'
</code></pre>
<p>通过上面的改进代码,如果我们将<code>three</code>作为命令行参数传递,我们将得到:</p>
<pre><code>demo.py: error: argument some_val: invalid choice: 'three' (choose from one, two)
</code></pre>
<hr/>
<p>IMHO,在将枚举成员的名称转换为小写的简单情况下,OP的方法似乎更简单。但是,对于更复杂的转换情况,这可能是有用的。</p>