Python argparse 互斥参数

4 投票
1 回答
2702 浏览
提问于 2025-04-16 09:57

我想知道如何让 argparse 实现类似下面的功能:

[ 'all' | [ pos1 [ pos2 [ pos3 ...]]]] --some --other --flags

这里的 all 是一个保留字 (如果不需要 - 前缀,做成标志是不合适的)

第二个问题是:是否可以为命名参数设置一些别名,比如 -h--help 代表同一个选项?也许我应该试试 add_mutually_exclusive_group()

1 个回答

4

add_mutually_exclusive_group() 这个功能就是为了让你能添加一个互斥的选项组。

关于你问题的第二部分,下面的代码应该能满足你的需求:

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')

除非你有特别的理由,否则我觉得没有必要不按照后面的方法来做。

撰写回答