Python argparse互斥args

Python argparse互斥args,python,argparse,Python,Argparse,如何让argparse执行以下操作: [ 'all' | [ pos1 [ pos2 [ pos3 ...]]]] --some --other --flags 其中,all是一个保留字(如果它不需要-前缀,则将其设为标志是不合适的) 第二: 命名参数是否可以有一些别名,如-h和-help表示相同的选项?也许我应该尝试使用添加互斥组()?添加互斥组()正是为此而设计的-您正在尝试添加互斥组 关于你问题的第二部分,这应该符合你的要求: parser.add_argument('-f', '--f

如何让argparse执行以下操作:

[ 'all' | [ pos1 [ pos2 [ pos3 ...]]]] --some --other --flags
其中,
all
是一个保留字(如果它不需要
-
前缀,则将其设为标志是不合适的)

第二:
命名参数是否可以有一些别名,如
-h
-help
表示相同的选项?也许我应该尝试使用
添加互斥组()

添加互斥组()正是为此而设计的-您正在尝试添加互斥组

关于你问题的第二部分,这应该符合你的要求:

parser.add_argument('-f', '--foobar')
(注意:你的问题有点让人困惑——这里有两个问题,第二个问题直接进入关于第一个问题的另一个句子。更不用说大量的打字错误了……我会尽力帮助你,但你越能把问题弄清楚,我们就越能回答你。)

更新 据我所知,互斥参数必须是必需的,但位置参数不能是必需的。因此,位置参数不能相互排斥(可能是因为否则解释器将无法分辨出是什么)。出于您的目的,我认为这并不重要,因为解释您的参数的代码实际上是相同的

假设你能以你所尝试的方式来做,那么你就必须这样做:

# all == True  
# pos == ('this', 'that', 'theother')

if all == true:
    do_some_stuff('all')
else:
    do_some_other_stuff('positional arguments')
然而,如果您接受“all”作为位置参数之一,则必须执行以下操作:

# pos = ('all', 'this, 'that', 'theother')

if pos[0] == 'all': #other parameters are ignored
    do_some_stuff('all')
else:
    do_some_other_stuff('positional arguments')

除非您有特定的原因,否则我认为没有理由不使用后一种方法。

那么“all”应该是一个标志参数,“pos”应该是一个位置参数,并且两者都应该属于互斥组?抱歉,但这不起作用,位置标记似乎不在同一组中。我还不断得到一个“ValueError:互斥参数必须是可选的”逻辑上互斥参数必须是可选的。如果其中一个是强制性的,那么它们将不再相互排斥。您确定这两个选项都设置为可选吗?如果这听起来很明显,我很抱歉!陛下也许我不能正确地解释这个问题。让我们后退一步。我想接受0。。n位置参数。如果第一个“位置”参数是reservd单词“all”,则我不接受其他位置参数。在任何情况下,我都接受标志或命名参数。我在argparse中找不到这样做的方法。当然,稍后我可以通过检查位置参数列表的内容来实现。第二个示例是我实际实现的。如果我能在解析参数时拒绝“all”案例中的额外位置,那将是一个“很好的选择”。代码如下:parser.add_参数('modules',metavar='MOD',nargs='*',help='list of modules or'all')parser.add_参数('-s','-recursive',dest='recursive',action='store_true',help='rekursiv')。。。如果len(args.modules)==0:。。。elif len(args.modules)==1和args.modules[0]。lower()=='all':。。。else:对于args.modules中的d:……啊……你的意思是实际上引发了一个错误,而不是默默地忽略它们?应该可以让argparse引发一个错误,尽管您可能需要自己实现它。。。你激起了我的兴趣!我刚做完工作,但今晚/明天我会尽力多帮些忙。