Python argparse - 强制参数 - 位置或可选
Python argparse - mandatory argument - either positional or optional
我希望用户能够通过位置参数或可选参数将强制参数传递给 'argparse'。
即
以下两种形式均有效:
my_prog arg
my_prog -m arg
我看过Argparse optional positional arguments?
但是那里的建议使 both 形式可选。我希望其中 一个 是强制性的。
当然,我可以在解析后添加一个手动检查至少设置了其中一个。但我有预感,一定有更好的解决办法。
(即使使用我的手动方法,'help' 部分也将它们都显示为可选)
mutually exclusive group
机制可以采用 required
参数。它还适用于一个 ?
位置以及可选参数(标记的参数)。 (多个 '?' 位置没有意义)。
至于 help
显示有 2 个默认组,positonal
和 optional
。因此,即使 optional
(已标记)设置为 required
,默认情况下它也会显示在 optional
组中。 usage
行是关于是否需要参数的更好指南。如果您不喜欢帮助部分中的组标签,请定义您自己的参数组。
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
糟糕,用法未显示互斥组中的 -f
和 pos
。有时 usage
格式很脆弱。
切换参数定义的顺序可以更好地使用
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
使用用户定义的参数组:
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
这是一般规则的一个例外 argument_groups 并且 mutually_exclusive_groups 不是为嵌套而设计的。
m-x-group 不是必需的,用法将使用 []
usage: ipython3 [-h] [-f FOO | pos]
我希望用户能够通过位置参数或可选参数将强制参数传递给 'argparse'。
即 以下两种形式均有效:
my_prog arg
my_prog -m arg
我看过Argparse optional positional arguments?
但是那里的建议使 both 形式可选。我希望其中 一个 是强制性的。
当然,我可以在解析后添加一个手动检查至少设置了其中一个。但我有预感,一定有更好的解决办法。
(即使使用我的手动方法,'help' 部分也将它们都显示为可选)
mutually exclusive group
机制可以采用 required
参数。它还适用于一个 ?
位置以及可选参数(标记的参数)。 (多个 '?' 位置没有意义)。
至于 help
显示有 2 个默认组,positonal
和 optional
。因此,即使 optional
(已标记)设置为 required
,默认情况下它也会显示在 optional
组中。 usage
行是关于是否需要参数的更好指南。如果您不喜欢帮助部分中的组标签,请定义您自己的参数组。
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
糟糕,用法未显示互斥组中的 -f
和 pos
。有时 usage
格式很脆弱。
切换参数定义的顺序可以更好地使用
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
使用用户定义的参数组:
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
这是一般规则的一个例外 argument_groups 并且 mutually_exclusive_groups 不是为嵌套而设计的。
m-x-group 不是必需的,用法将使用 []
usage: ipython3 [-h] [-f FOO | pos]