关于Python argparse:Python argparse – 必需参数 – 无论是位置还是可选

Python argparse - mandatory argument - either positional or optional

我希望用户能够使用位置参数或可选参数将强制参数传递给"argparse"。

即。,以下两种表格均有效:

1
2
my_prog arg
my_prog -m arg

我见过argparse可选位置参数吗?

但是这里的建议使得这两种形式都是可选的。我希望其中一个是强制性的。

当然,我可以在分析至少设置了其中一个之后添加手动检查。但我预感到一定有更好的解决办法。

(即使使用我的手动方法,"帮助"部分也将它们显示为可选)


mutually exclusive group机制可以接受required参数。它还与一个?位置和选项(标记参数)一起工作。(不止一个'?'位置不合理)。

对于help显示,有两个默认组:positonaloptional。因此,即使将optional设置为required,默认情况下,它也显示在optional组中。关于是否需要一个论点,usage行是一个更好的指南。如果不喜欢"帮助"部分中的组标签,请定义自己的参数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
In [146]: import argparse
In [147]: parser = argparse.ArgumentParser()
In [148]: gp = parser.add_mutually_exclusive_group(required=True)
In [149]: gp.add_argument('pos', nargs='?', default='foo');
In [150]: gp.add_argument('-f','--foo', default='bar');

In [151]: parser.parse_args('arg'.split())
Out[151]: Namespace(foo='bar', pos='arg')

In [152]: parser.parse_args('-f arg'.split())
Out[152]: Namespace(foo='arg', pos='foo')

In [153]: parser.parse_args('arg -f arg'.split())
usage: ipython3 [-h] [-f FOO] [pos]
ipython3: error: argument -f/--foo: not allowed with argument pos

In [154]: parser.parse_args(''.split())
usage: ipython3 [-h] [-f FOO] [pos]
ipython3: error: one of the arguments pos -f/--foo is required


In [155]: parser.parse_args('-h'.split())
usage: ipython3 [-h] [-f FOO] [pos]

positional arguments:
  pos

optional arguments:
  -h, --help         show this help message and exit
  -f FOO, --foo FOO

哎呀,用法并没有显示-fpos在一个相互排斥的群体中。有时,usage格式很脆弱。

切换参数定义的顺序可以更好地使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
In [156]: parser = argparse.ArgumentParser()
In [157]: gp = parser.add_mutually_exclusive_group(required=True)
In [158]: gp.add_argument('-f','--foo', default='bar');
In [159]: gp.add_argument('pos', nargs='?', default='foo');
In [160]:
In [160]: parser.parse_args('-h'.split())
usage: ipython3 [-h] (-f FOO | pos)

positional arguments:
  pos

optional arguments:
  -h, --help         show this help message and exit
  -f FOO, --foo FOO

使用用户定义的参数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [165]: parser = argparse.ArgumentParser()
In [166]: gp = parser.add_argument_group('Mutually exclusive')
In [167]: gpm = gp.add_mutually_exclusive_group(required=True)
In [168]: gpm.add_argument('-f','--foo', default='bar');
In [169]: gpm.add_argument('pos', nargs='?', default='foo');
In [170]:
In [170]: parser.parse_args('-h'.split())
usage: ipython3 [-h] (-f FOO | pos)

optional arguments:
  -h, --help         show this help message and exit

Mutually exclusive:
  -f FOO, --foo FOO
  pos

这是一般规则参数"组"和相互排斥的"组"的一个例外,它们不是为嵌套而设计的。

不需要m-x-group,使用将使用[]

1
usage: ipython3 [-h] [-f FOO | pos]