<p>虽然<a href="https://stackoverflow.com/a/17909525/492620">Jonathan's answer</a>对于复杂的选项来说非常好,但是对于简单的情况,有一个非常简单的解决方案,例如1个选项排除了2个其他选项,如</p>
<pre><code>command [- a xxx | [ -b yyy | -c zzz ]]
</code></pre>
<p>甚至如最初的问题:</p>
<pre><code>pro [-a xxx | [-b yyy -c zzz]]
</code></pre>
<p>我会这样做:</p>
<pre><code>parser = argparse.ArgumentParser()
# group 1
parser.add_argument("-q", "--query", help="query", required=False)
parser.add_argument("-f", "--fields", help="field names", required=False)
# group 2
parser.add_argument("-a", "--aggregation", help="aggregation",
required=False)
</code></pre>
<p>我在这里使用给命令行包装器的选项来查询mongodb。<code>collection</code>实例可以调用方法<code>aggregate</code>,也可以调用具有可选参数<code>query</code>和<code>fields</code>的方法<code>find</code>,因此您可以看到前两个参数兼容而最后一个参数不兼容的原因</p>
<p>现在我运行<code>parser.parse_args()</code>并检查它的内容:</p>
<pre><code>args = parser().parse_args()
print args.aggregation
if args.aggregation and (args.query or args.fields):
print "-a and -q|-f are mutually exclusive ..."
sys.exit(2)
</code></pre>
<p>当然,这个小技巧只适用于简单的情况,如果你有许多相互排斥的选项和组,那么检查所有可能的选项将成为一场噩梦。在这种情况下,你应该打破你的选择,以命令组,如乔纳森建议。</p>